代码之家  ›  专栏  ›  技术社区  ›  Muhammad Alkarouri

F#会自动记忆吗?

  •  5
  • Muhammad Alkarouri  · 技术社区  · 16 年前

    我有这个密码:

    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
    

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

    编辑:贾里德提供了正确的答案。现在我知道要找什么了,我可以从 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 回复  |  直到 9 年前
        1
  •  16
  •   JaredPar    16 年前

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

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

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

        2
  •  4
  •   Cogwheel    16 年前

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

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