2009-12-14 33 views
7

Tôi cố gắng để viết một cái gì đó giống nhưmột hàm timeit cho F #

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

nó hoạt động cho

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

nhưng không phải cho

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

sa F # là đánh máy tĩnh.

Bất kỳ ý tưởng nào? Cảm ơn.

Trả lời

4

Ngay cả trong trường hợp ma trận, bạn cần áp dụng hàm vào giá trị. Hãy thử điều này:

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 là đúng về việc sử dụng lớp StopWatch, mặc dù.

+0

cách có hai/nhiều tham số cho f? –

+1

Nếu bạn có nhiều tham số hơn, bạn có thể sử dụng currying: thời gian của f x y trở thành '(timeit f x) y', vì (f x) là hàm chỉ cần y. Và '(timeit g x y) z' tính thời gian của g x y z, vv .. – cfern

+0

Hmm. Không có chỉnh sửa nhận xét. Tôi có nghĩa là timeit (f x) y. Dấu ngoặc đơn quan trọng trong trường hợp này. Xin lỗi vì việc đó. – cfern

9

Đưa nó cùng

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

Lưu ý rằng điều này làm việc cho bất kỳ chức năng nào; bạn có thể áp dụng nó vào một khối mã tùy ý a la: "timeit (fun() -> arbitraryBlockOfCode)()". Tức là, bọc một khối mã trong một lambda để truyền mã tùy ý cho hàm. – Brian

7

Khi kiểm tra mã trong F # tương tác, bạn có thể sử dụng các chỉ thị #time gian mỗi đoạn mã mà bạn gửi đến/nhập trong F # tương tác. Ví dụ:

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

tính năng rất tốt! – kev

Các vấn đề liên quan