F#会自动记忆吗?

F#会自动记忆吗?,f#,profiling,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 (

我有以下代码:

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
问题是为什么代码只计算一次结果(从插入时间开始,结果总是正确且相等的)?另外,如何强制程序多次执行计算(我需要它来进行分析)

编辑:贾里德提供了正确的答案。现在我知道要找什么了,我可以从

我得到了以下结果:

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

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


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

第一次计时可能是由于JIT编译。您正在计时的实际代码运行的时间可能比DateTime能够度量的时间要短


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

+1。需要明确的是:对于本机代码(例如,用C编写的代码),第一次调用的速度也较慢,因为它必须加载到内存中,从那里加载到缓存中;分支预测在第一次可能会做得更糟,等等。对于
系统、诊断、秒表等+1,它是您盈利的好朋友谢谢。它起作用了,我已经相应地编辑/关闭了问题。