为什么这个定时功能总是测量0ms?

时间:2011-01-28 13:35:44

标签: f#

我正在计算一些算法并提出下面的时间函数。但是,它总是返回0毫秒。

问题是为什么它显然需要几秒钟才能显示为0ms。我是F#开发人员的开始,所以我可能错过了一些概念。

请注意,问题不在于更高效的Fibonacci算法,而且我也知道该函数正在测量实际世界时间而不是CPU时间(可以通过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 个答案:

答案 0 :(得分:6)

问题是你的时间函数需要一个单参数函数,但是你用一个双参数调用它:

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#interactive中进行测试,请使用#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 = ()

答案 1 :(得分:5)

您的问题是,由于功能应用程序的工作方式,您正在执行此操作:

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

因此,您需要计算将Array.iter应用于函数值fun x -> ignore (fib x)需要多长时间,这不会花费很长时间,并导致另一个类型为{{1}的函数},然后您将其应用于int array -> ()。相反,你应该尝试

[| 1 .. 40 |]