F#会自动记忆吗?

时间:2010-06-29 21:15:12

标签: f# profiling

我有这段代码:

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

2 个答案:

答案 0 :(得分:16)

F#不会对您的功能进行自动记忆。在这种情况下,备忘录将是不正确的。即使您没有直接改变项目,也可以从函数中访问可变值(DateTime.Now)。记住该函数或访问它的函数将是一个错误,因为它可以在不同的调用之间进行更改。

您在这里看到的是.Net JIT的效果。第一次运行时,函数f()是JIT'd并产生明显的延迟。其他时候它已经JIT并且执行的时间小于DateTime

的粒度

证明这一点的一种方法是使用更精细的测量类,如StopWatch。这将显示该函数执行多次。

答案 1 :(得分:4)

第一个时间可能是由于JIT编译。您计时的实际代码可能比DateTime能够测量的时间更短。

编辑:18秒击败...我很高兴我有正确的想法:)