我正在计算一些算法并提出下面的时间函数。但是,它总是返回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#开发人员提供的任何帮助和指示
问候,汤姆
答案 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 |]