Я пытаюсь записать что-то как
let timeit (x:'a->'b) =
let start = System.DateTime.Now
x
let duration = System.DateTime.Now - start
printfn "time usage = %A" duration.Milliseconds
()
это работает на
let matrixtest() =
let x = vector[1.;2.;4.]
let y = matrix[[1.;2.;4.;];[3.;4.;9.;]]
printfn "%A" (y * x)
()
но не для
let rec fib x =
match x with
| 0 | 1 -> 1
| n -> fib (n-1) + fib (n-2)
sa F# статичен введенный.
Какая-либо идея?Спасибо.
Даже в матричном случае вам нужно применить функцию к значению. Попробуйте следующее:
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
Aequitarum Custos прав, говоря об использовании класса StopWatch
.
Собираем вместе
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
При тестировании кода в интерактивном F # вы можете использовать директиву #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]
>
Используйте System.Diagnostics.Stopwatch
Гораздо более точное время.
Предполагается, что вы получили результат в 0 секунд, что не является DateTime.Теперь не работает, это просто низкая точность.
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx