2009-12-14 11 views
7

के लिए एक timeit समारोह मैं के लिएएफ #

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

सा एफ # के लिए

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

लेकिन नहीं की तरह

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

कुछ यह काम करता है लिखने के लिए कोशिश कर रहा हूँ स्थिर टाइप किए हुए है।

कोई विचार? धन्यवाद।

उत्तर

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 वर्ग का उपयोग कर के बारे में सही है, हालांकि।

+0

एफ के लिए दो/अधिक पैरामीटर होने के बारे में कैसे? –

+1

यदि आपके पास अधिक पैरामीटर हैं, तो आप करी का उपयोग कर सकते हैं: एफ एक्स वाई का समय '(टाइमिट एफ एक्स) वाई' बन जाता है, क्योंकि (एफ एक्स) एक ऐसा फ़ंक्शन है जिसे केवल वाई की आवश्यकता होती है। और '(टाइमिट जी एक्स वाई) जेड जी जी एक्स वाई जेड, आदि की गणना .. – cfern

+0

हम्म। कोई टिप्पणी संपादन नहीं। मेरा मतलब टाइमिट (एफ एक्स) वाई था। इस मामले में माता-पिता का मामला है। उसके लिए क्षमा चाहता हूँ। – cfern

7

System.Diagnostics.Stopwatch उपयोग

बहुत अधिक समय में सटीक।

यह माना जाता है कि आपको 0 सेकंड का परिणाम मिल रहा है, जो डेटटाइम नहीं है.अब काम नहीं कर रहा है, यह केवल खराब सटीकता है।

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

9

यह एक साथ

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

ध्यान दें कि यह किसी भी फ़ंक्शन के लिए काम करता है; आप इसे एक मनमानी कोड ब्लॉक ला ला सकते हैं: "टाइमिट (मजेदार() -> arbitraryBlockOfCode)()"। यही है, फ़ंक्शन में मनमाने ढंग से कोड पास करने के लिए लैम्बडा में कोड का एक ब्लॉक लपेटें। – Brian

7

लाना एफ # में कोड का परीक्षण जब इंटरैक्टिव, आप कोड के प्रत्येक टुकड़े आप को भेजें समय पर #time निर्देश उपयोग कर सकते हैं/एफ # इंटरैक्टिव में दर्ज करें। उदाहरण:

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

बहुत अच्छी सुविधा! – kev