F # выполняет автоматическое запоминание? - PullRequest
5 голосов
/ 30 июня 2010

У меня есть этот код:

for i in 1 .. 10 do
    let (tree, interval) = time (fun () -> insert [12.; 6. + 1.0] exampletree 128.)
    printfn "insertion time: %A" interval.TotalMilliseconds
    ()

с функцией времени, определенной как

let time f =
    let start = DateTime.Now
    let res = f ()
    let finish = DateTime.Now
    (res, finish - start)

функция вставки здесь не имеет значения, за исключением того факта, что она не использует мутацию и, таким образом, каждый раз возвращает одно и то же значение.

Я получаю результаты:

insertion time: 218.75
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0

Вопрос в том, почему код вычисляет результат только один раз (из времени вставки результат всегда верен и равен)? Кроме того, как заставить программу выполнять вычисления несколько раз (мне это нужно для профилирования)?

Редактировать: Джаред дал правильный ответ. Теперь, когда я знаю, что искать, я могу получить код секундомера из функции timeit для F #

У меня были следующие результаты:

insertion time: 243.4247
insertion time: 0.0768
insertion time: 0.0636
insertion time: 0.0617
insertion time: 0.065
insertion time: 0.0564
insertion time: 0.062
insertion time: 0.069
insertion time: 0.0656
insertion time: 0.0553

Ответы [ 2 ]

16 голосов
/ 30 июня 2010

F # не выполняет автоматическое запоминание ваших функций.В этом случае запоминание будет некорректным.Даже если вы не изменяете элементы напрямую, вы получаете доступ к изменяемому значению (DateTime.Now) из своей функции.Запоминание этого или доступа к функции было бы ошибкой, поскольку оно может меняться от вызова к вызову.

То, что вы видите здесь, является эффектом .Net JIT.При первом запуске функция f () будет JIT'd и выдает заметную задержку.В других случаях это уже JIT и выполняется время, которое меньше, чем гранулярность DateTime

. Один из способов доказать это - использовать более гранулированный класс измерения, такой как StopWatch.Это покажет, что функция выполняется много раз.

4 голосов
/ 30 июня 2010

Первое время, вероятно, связано с компиляцией JIT.Фактический код, который вы синхронизируете, вероятно, выполняется за меньшее время, чем DateTime способен измерить.

Редактировать: Избит на 18 секунд ... Я просто рад, что у меня была правильная идея:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...