Почему эта функция синхронизации всегда измеряет 0 мс? - PullRequest
5 голосов
/ 28 января 2011

Я синхронизирую некоторые алгоритмы и придумаю функцию времени ниже.Тем не менее, он всегда возвращает 0 мс.

Вопрос в том, почему всегда 0 мс, когда это явно занимает несколько секунд.Я начинающий F # разработчик, поэтому мне, вероятно, не хватает некоторых концепций.

Обратите внимание, что вопрос не в более эффективном алгоритме Фибоначчи, и я также знаю, что функция измеряет время реального мира, а не время процессора (которое можно получить с помощью Sys.time ())

let time f x =
   let timer = new System.Diagnostics.Stopwatch()
   timer. Start ( )
   try f x finally
   printf "Took %dms" timer.ElapsedMilliseconds;;

let rec fib x = 
   if x < 2 then 1
   else fib(x-1) + fib(x-2)

time Array.iter (fun x -> ignore (fib x) ) [| 1 .. 40 |] 

Спасибо за любую помощь и указатели для начинающего разработчика F #

С уважением, Том

Ответы [ 2 ]

6 голосов
/ 28 января 2011

Проблема в том, что ваша функция времени ожидает функцию с одним аргументом, но вы вызываете ее с функцией с двумя аргументами:

time Array.iter (fun x -> ...) [|1..40|]
                 ^- first arg   ^- second arg

Чтобы получить желаемый результат, используйте скобки

time (Array.iter (fun x -> ignore (fib x) )) [| 1 .. 40 |] 
      ^- a single partially curried function  ^- a single argument

Например, в FSI:

> time ( Array.iter (fun x -> ignore (fib x) ) ) [| 1 .. 40 |];;
Took 6589msval it : unit = ()

Еще лучше, если вы тестируете в F # интерактиве, используйте директиву #time, и FSI подберет время для вас. Пример:

> #time;;

--> Timing now on

> Array.iter (fun x -> ignore (fib x) ) [| 1 .. 40 |];;
Real: 00:00:06.816, CPU: 00:00:06.218, GC gen0: 0, gen1: 0, gen2: 0
val it : unit = ()
5 голосов
/ 28 января 2011

Ваша проблема в том, что из-за того, как работает приложение функции, вы делаете это:

((time Array.iter) (fun x -> ignore (fib x))) [| 1 .. 40 |]

поэтому вы определяете, сколько времени потребуется, чтобы применить Array.iter к значению функции fun x -> ignore (fib x), которое совсем не занимает много времени, и приводит к другой функции типа int array -> (), которую вы затем применяется к [| 1 .. 40 |]. Вместо этого вы должны попробовать

time (Array.iter (fun x -> ignore (fib x))) [| 1 .. 40 |] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...