我有这段代码:
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)
函数insert在这里不相关,除了它不使用变异这样的事实,因此每次返回相同的值。
我得到了结果:
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
问题是为什么代码只计算一次结果(从插入时间开始,结果总是正确且相等)?另外,如何强制程序多次执行计算(我需要用于分析目的)?
编辑:Jared提供了正确的答案。现在我知道要查找什么,我可以从a timeit function for 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
答案 0 :(得分:16)
F#不会对您的功能进行自动记忆。在这种情况下,备忘录将是不正确的。即使您没有直接改变项目,也可以从函数中访问可变值(DateTime.Now
)。记住该函数或访问它的函数将是一个错误,因为它可以在不同的调用之间进行更改。
您在这里看到的是.Net JIT的效果。第一次运行时,函数f()是JIT'd并产生明显的延迟。其他时候它已经JIT并且执行的时间小于DateTime
证明这一点的一种方法是使用更精细的测量类,如StopWatch
。这将显示该函数执行多次。
答案 1 :(得分:4)
第一个时间可能是由于JIT编译。您计时的实际代码可能比DateTime能够测量的时间更短。
编辑:18秒击败...我很高兴我有正确的想法:)