我想写点像
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#是静态类型的.
任何的想法?谢谢.
把它放在一起
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)
使用System.Diagnostics.Stopwatch
更准确的时间安排.
这假设你得到0秒的结果,这不是DateTime.Now不工作,它只是很差的准确性.
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
在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)
即使在矩阵情况下,您也需要将函数应用于一个值。尝试这个:
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。