F#会自动记忆吗?

Muh*_*uri 5 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
    ()
Run Code Online (Sandbox Code Playgroud)

时间函数定义为

let time f =
    let start = DateTime.Now
    let res = f ()
    let finish = DateTime.Now
    (res, finish - start)
Run Code Online (Sandbox Code Playgroud)

函数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
Run Code Online (Sandbox Code Playgroud)

问题是为什么代码只计算一次结果(从插入时间开始,结果总是正确且相等)?另外,如何强制程序多次执行计算(我需要用于分析目的)?

编辑:贾里德提供了正确的答案.现在我知道要查找什么,我可以从F#的timeit函数中获取秒表代码

我有以下结果:

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
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 16

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

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

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

  • 对于`System.Diagnostics.Stopwatch`来说,它是你分析的好朋友 (3认同)