F#的timeit函数

Yin*_*Zhu 7 .net f#

我想写点像

let timeit (x:'a->'b) =
    let start = System.DateTime.Now
    x
    let duration = System.DateTime.Now - start
    printfn "time usage = %A" duration.Milliseconds 
    ()
Run Code Online (Sandbox Code Playgroud)

它适用于

let matrixtest() =
    let x = vector[1.;2.;4.]
    let y = matrix[[1.;2.;4.;];[3.;4.;9.;]]
    printfn "%A" (y * x)
    ()
Run Code Online (Sandbox Code Playgroud)

但不是

let rec fib x = 
        match x with
        | 0 | 1 -> 1
        | n -> fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)

sa F#是静态类型的.

任何的想法?谢谢.

Dar*_*rio 9

把它放在一起

let timeit f v = 
    let watch = new System.Diagnostics.Stopwatch()
    watch.Start()
    let res = f v 
    watch.Stop()
    printfn "Needed %f ms" (watch.Elapsed.TotalMilliseconds)
    res
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这适用于任何功能; 你可以把它应用到任意代码块la:"timeit(fun() - > arbitraryBlockOfCode)()".也就是说,在lambda中包装一段代码以将任意代码传递给函数. (2认同)

Bre*_*len 7

使用System.Diagnostics.Stopwatch

更准确的时间安排.

这假设你得到0秒的结果,这不是DateTime.Now不工作,它只是很差的准确性.

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx


cfe*_*ern 7

在F#interactive中测试代码时,您可以使用该#time指令计算发送到/输入F#interactive的每段代码的时间.例:

> #time;;

--> Timing now on

> let slowstring = List.fold (+) "" [for i in 1..10000 -> string i];;
Real: 00:00:00.544, CPU: 00:00:00.546, GC gen0: 464, gen1: 37, gen2: 0

val slowstring : string =
  "1234567891011121314151617181920212223242526272829303132333435"+[38833 chars]

> let quickstring = String.concat "" [for i in 1..10000 -> string i];;
Real: 00:00:00.008, CPU: 00:00:00.015, GC gen0: 0, gen1: 0, gen2: 0

val quickstring : string =
  "1234567891011121314151617181920212223242526272829303132333435"+[38833 chars]

> 
Run Code Online (Sandbox Code Playgroud)


kvb*_*kvb 4

即使在矩阵情况下,您也需要将函数应用于一个值。尝试这个:

let timeit f v =
  let start = System.DateTime.Now
  let result = f v
  let duration = System.DateTime.Now - start
  printfn "time usage = %A" duration.Milliseconds 
  result
Run Code Online (Sandbox Code Playgroud)

不过, Aequitarum Custos 关于使用该类的观点是正确的StopWatch