2009-12-04 44 views
0

我有其中我使用System.Diagonstics時間算法 - 經由秒錶時序一組方法 - 它們運行在第二時間,它們更快

它工作的很好,但我注意到的一件事是,我第一次運行該算法需要大約52毫秒,這是偉大的。

第二次運行算法時,只需要幾分之一的時間。

這是由於性質.NET

每次我用一組新數據運行該算法時,我都會重新初始化它。換句話說,我創建了一個新的對象,而不是重新使用舊的引用,所以我不知道爲什麼這仍然會發生。通常我不會在意這樣的事情,但是爲了完成這項任務,我必須測量算法的效率和速度,因此瞭解這種情況發生的原因對我來說很重要。的我如何使用定時器

僞代碼如下:

Algorithm class 

Stopwatch get/set 

Method A 
    Start stopwatch 
    // Do work. 
    Stop stopwatch 
End 

Method B 
    Start stopwatch 
    // Do work. 
    Stop stopwatch 
End 

End 

後這兩種方法都在叫我的亞軍,我得到了秒錶和檢查的時間。

該算法

該算法是用於計算機控制的A.I opponnents戰術航路點推理。在上面的例子中,我試圖儘可能地簡化它。

結果

19.7847 
0.0443 
0.0102 
0.0159 
0.0091 
0.0073 
0.0079 
0.0079 
0.0079 
0.0079 
0.0079 
0.0079 
0.0136 
0.0079 
0.0073 
0.0079 
0.0079 
0.0079 
0.0079 
0.0073 
... 

我應該忽略第一次算法運行?否則,我將得到與第一次運行時的值基本相同的平均值。

+0

你能給出你的alghoritm的抽象概念嗎? – 2009-12-04 11:11:12

+0

我認爲這將是涉及JIT的東西,但我不確定。所以你會說爲了有一個公平的測試,我應該忽略它的第一次跑步,並採取以下嘗試的時機? – Finglas 2009-12-04 11:12:27

+0

這出色的職位上SO:HTTP://計算器。com-questions/1507405/c-is-this-benchmarking-class-accurate涵蓋了許多可用於提高計時準確性的技巧:包括「預熱Jit'r」,「呼叫GC」和「等待對於待定終結者「 – BillW 2009-12-04 15:49:46

回答

5

如果您只爲52毫秒的時間,任何事情都可能會發生 - 這是時間來衡量一個非常小的量。例如,它可能是因爲JIT編譯了該方法及其涉及的所有內容。

一般情況下,得到你要定時多次迭代來獲得更長的時期有用的測量 - 這降低了噪音,由於(例如)在操作系統中其他一些事件採取CPU走簡單。

+0

我沒有想到這個。但我注意到,每當我敲擊鼠標按鈕時,它都會有所不同。我會做你自己和馬克提到的,並把它放在一個循環中,並取平均值。 – Finglas 2009-12-04 11:15:05

+0

「融合」也傾向於佔據大量的首次成本。 – 2009-12-04 12:29:25

1

第一次運行時,CLR字節碼必須被JITed,這會產生開銷。後續處決不會產生這筆費用。

+0

我會+1這個,因爲它是第一,只有重要的是要考慮任何數量的事情可以有影響,而這個答案表明,唯一可能的解釋是JIT時間 – 2009-12-04 11:13:35

2

在循環中重複測試數千次以獲得平均值。當你這樣做時,你應該儘量不分配和釋放對象,所以你減少了垃圾收集的可能性。

+0

+1,沒想到這個。 – Finglas 2009-12-04 11:15:39

+0

++我所做的是用我的手錶時間。如果我想毫秒,我運行它1000次。微秒 - 10^6次等 – 2009-12-04 14:24:42

相關問題