2012-11-18 84 views
4

我有一個非常具體的問題,我需要回答一個非常具體的性能測試。我將簡化代碼,使其更易於理解。是否需要一些時間來啓動和停止秒錶?

我做了很多計算(幾千萬),都在循環中完成,它們本身不會太長,我需要總計算時間。然而,所有的計算都不是一個接一個地直接完成,而是在每個循環之間插入一些額外的代碼。我所需要的,完全是所有循環的總時間(包括聲明和初始化i,增加它,並與exmaple中的100進行比較)。爲了測量時間,我在每個循環之前直接啓動Stopwatch,並在循環之後直接停止它。但是,這兩個行動需要一些可能相關的時間嗎?

例子:

Stopwatch sw = new Stopwatch(); 

sw.Start(); 
//how long does it now take until for loop is reached? 
for(int i = 0; i < 100; i++) 
{ 
    //some calculations 
} 
//how much time does it take to stop sw? 
sw.Stop(); 

當然它不會真的重要,如果所有的循環中直接完成了一個又一個,我剛開始在第一循環的開始和結束時停止最後一個,但這在這裏是不可能的。

我知道這個問題很具體,但我希望有人能幫助我,因爲來自五千萬個循環的重要時間可能會影響我的結果。

回答

2

那麼,你可以嘗試一下,自己檢查一下,在我的(糟糕的表演)計算機上,第一次執行約0.0006毫秒,下一次執行約0.0001毫秒。嘗試一下:

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
sw.Stop(); 
TimeSpan ts = TimeSpan.FromTicks(sw.ElapsedTicks); 
string elapsed = ts.TotalMilliseconds.ToString(); 
+0

感謝提到StopWatch-Stopwatch的錯字。我只是習慣使用秒錶StopWatch =新秒錶();'和某種方式使用大寫W. 到你的答案:謝謝,我曾想過這樣做,但認爲,這可能是「一個不同的情況」。然而,作爲一個檢查,我可能會運行你的代碼幾千次,並在一段時間內平均。 – phil13131

4

我需要什麼,完全是所有循環的總時間。要測量時間,我在每個循環之前直接啓動StopWatch,並在循環之後直接停止它。但是,這兩個行動需要一些可能相關的時間嗎?

他們需要一些時間 - 如初始化i和增量,並在每次循環迭代中與100進行比較。計算中幾乎沒有什麼是瞬時

不管是不是有關是否是另一回事。除非你的計算是非常微不足道的,否則這在你的時間裏不太可能會很重要。您可以嘗試計時一個空循環,但可能JIT編譯器將完全擺脫循環本身。

+0

除了達到for-loop的實際時間外,一切都是相關的(初始化i,增量,比較)。這些計算是相當簡單的(有時候只是一些補充),有時循環很短(大約10次迭代)。 我以爲這是暗示,我會更新我的問題。 – phil13131

+0

@ phil13131:在這一點上,很難得到任何真正的表現。正如我所說的,你可以*嘗試*空循環 - 或者嘗試最小的非平凡操作,避免JIT編譯器優化它 - 找到基礎結果。但基本上,這聽起來像答案是,「是的,這些行動需要一段時間。」請注意,如果您事先調用'Start'和'Stop'方法(可能在不同的實例上),它們將會被JIT編譯。 (否則,JIT編譯可能是你測量的一部分......) –

+0

謝謝你提到JIT編譯,但是當你到達'sw.Start()'的方法時,不應該在那時代碼已經編譯? – phil13131

相關問題