2012-12-24 243 views

回答

643

Stopwatch是爲此目的而設計的,它是測量.NET中時間執行的最佳方法之一。

var watch = System.Diagnostics.Stopwatch.StartNew(); 
// the code that you want to measure comes here 
watch.Stop(); 
var elapsedMs = watch.ElapsedMilliseconds; 

Do not use DateTime在.NET中測量時間執行。


UPDATE:

正如在評論部分@ series0ne指出:如果你想要的一些代碼執行的真實精確的測量,你將不得不使用的內置到性能計數器操作系統。 following answer包含一個很好的概述。

+2

究竟,什麼:我有一個foreach循環,它有一個ThreadPool.QueueUserWorkItem(代理 {CopyFiles(folder,dest); }); '裏面,但秒錶停止一切完成之前。 –

+1

然後,您應該將秒錶放入代表內,以測量CopyFiles方法的性能。 –

+8

@DarinDimitrov - 秒錶不完全準確?記住.NET背景噪音(如JITing)會導致不同的執行時間發生。因此,對於準確的測量,實際上OP應該使用性能分析器。 – series0ne

17

如果您有興趣瞭解性能,最好的答案是使用分析器。

否則,System.Diagnostics.StopWatch提供高分辨率定時器。

+0

絕對正確!我有些沮喪,有很多人在這裏建議使用秒錶,因爲它不完全準確。然而,正如您建議使用性能分析器一樣,這是正確的方法! +1 – series0ne

19

StopWatch class尋找最佳解決方案。

Stopwatch sw = Stopwatch.StartNew(); 
DoSomeWork(); 
sw.Stop(); 

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds); 

此外它還有一個靜態字段,稱爲Stopwatch.IsHighResolution。當然,這是一個硬件和操作系統問題。

指示定時器是否基於高分辨率性能 計數器。

7

StopWatch將使用高分辨率計數器

通過計算計時器在 底層計時器滴答機制經過時間的秒錶措施。如果安裝的硬件和操作系統支持高分辨率性能計數器,則秒錶類使用該計數器來測量已用時間。否則, 秒錶類使用系統計時器來測量已用時間。使用頻率和IsHighResolution字段來確定精確度 和秒錶計時實施的分辨率。

如果您正在測量IO,那麼您的數據可能會受到外部事件的影響,我會擔心這麼多。 正確性(如上所述)。相反,我會採取一系列的測量,並考慮這些數字的均值和分佈。

45

從個人經驗來看,System.Diagnostics.Stopwatch類可以用來衡量一個方法的執行時間,但是,請注意:這不完全準確!

請看下面的例子:

Stopwatch sw = Stopwatch.StartNew(); 

for(int index = 0; index < 10; index++) 
{ 
    DoSomething(); 
    Console.WriteLine(sw.ElapsedMilliseconds); 
} 

sw.Stop(); 

示例結果

132ms 
4ms 
3ms 
3ms 
2ms 
3ms 
34ms 
2ms 
1ms 
1ms 

現在你想知道; 「那麼爲什麼它第一次需要132ms,而其餘時間要少得多呢?」

答案是Stopwatch不能補償.NET中的「背景噪音」活動,如JITing。因此,第一次運行你的方法時,.NET JIT就是第一次。執行此操作所需的時間會被添加到執行時間。同樣,其他因素也會導致執行時間發生變化。

你真正需要的絕對準確性是性能分析

看看以下內容:

展鵬螞蟻性能分析器是一個商業產品,但會產生非常準確的結果。 - Boost the performance of your applications with .NET profiling

下面是分析一個StackOverflow的文章: - What Are Some Good .NET Profilers?

我也寫上使用秒錶性能分析的文章,你可能想看看 - 這個案子Performance profiling in .NET

+0

好點+1。感謝您的準確性,爲了簡單起見,我接受了Darin的答案,在這種情況下,準確性處於第二級重要性。 –

+2

@mahditahsildari沒問題。很高興我能幫上忙! :-) – series0ne

+13

我不知道爲什麼這是一個*錯誤*的例子。秒錶正準確地測量第一次通話的總費用,這與將要運行該代碼的客戶確實是相關的。他們並不關心這些132毫秒是用於執行方法還是抖動,他們關心的是總時間。 –