2009-12-14 13 views
7

ich so etwas wieeine timeit Funktion für F #

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

zu schreiben versuche es für

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

aber nicht für

let rec fib x = 
     match x with 
     | 0 | 1 -> 1 
     | n -> fib (n-1) + fib (n-2) 

sa F # funktioniert, ist statisch typisiert.

Irgendeine Idee? Vielen Dank.

Antwort

4

Auch in der Matrix Fall müssen Sie die Funktion auf einen Wert anzuwenden. Versuchen Sie folgendes:

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 die StopWatch Klasse zu verwenden, wenn richtig ist.

+0

Wie wäre es mit zwei/mehr Parameter für f? –

+1

Wenn Sie mehr Parameter haben, können Sie currying verwenden: Das Timing von f x y wird zu '(timeit f x) y', da (f x) eine Funktion ist, die nur ein y benötigt. Und '(Zeit g x y) z' mal die Berechnung von g x y z, etc .. – cfern

+0

Hmm. Keine Bearbeitung von Kommentaren Ich meinte Zeit (fx) y. In diesem Fall spielen Klammern eine Rolle. Entschuldigen Sie. – cfern

9

setzen sie zusammen

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 
+2

Beachten Sie, dass dies für jede Funktion funktioniert; Sie können es auf einen beliebigen Code-Block a la anwenden: "timeit (fun() -> arbiaryBlockOfCode)()". Das heißt, einen Codeblock in ein Lambda umwandeln, um beliebigen Code an die Funktion zu übergeben. – Brian

7

Wenn in F # Testen Code interaktiv, können Sie die #time Richtlinie zu Zeit jedes Stück Code, den Sie/Eingabe in F # interaktiven senden. Beispiel:

> #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] 

> 
+0

sehr gute Eigenschaft! – kev