timeit функционирует для F#

Я пытаюсь записать что-то как

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# статичен введенный.

Какая-либо идея?Спасибо.

7
задан Brett Allen 14 December 2009 в 19:23
поделиться

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

Aequitarum Custos прав, говоря об использовании класса StopWatch .

4
ответ дан 6 December 2019 в 06:36
поделиться

Собираем вместе

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
9
ответ дан 6 December 2019 в 06:36
поделиться

При тестировании кода в интерактивном 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]

> 
7
ответ дан 6 December 2019 в 06:36
поделиться

Используйте System.Diagnostics.Stopwatch

Гораздо более точное время.

Предполагается, что вы получили результат в 0 секунд, что не является DateTime.Теперь не работает, это просто низкая точность.

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

7
ответ дан 6 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: