可能重複:
How do I measure how long a function is running?計算的方法的執行時間
我已經從另一個的位置的I/O時間拍攝方法,其複製數據。計算執行時間的最好和最真實的方法是什麼? Thread
? Timer
? Stopwatch
?其他解決方案?我想要最精確的一個,儘可能簡短。
可能重複:
How do I measure how long a function is running?計算的方法的執行時間
我已經從另一個的位置的I/O時間拍攝方法,其複製數據。計算執行時間的最好和最真實的方法是什麼? Thread
? Timer
? Stopwatch
?其他解決方案?我想要最精確的一個,儘可能簡短。
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包含一個很好的概述。
如果您有興趣瞭解性能,最好的答案是使用分析器。
否則,System.Diagnostics.StopWatch提供高分辨率定時器。
絕對正確!我有些沮喪,有很多人在這裏建議使用秒錶,因爲它不完全準確。然而,正如您建議使用性能分析器一樣,這是正確的方法! +1 – series0ne
StopWatch
class尋找最佳解決方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
此外它還有一個靜態字段,稱爲Stopwatch.IsHighResolution
。當然,這是一個硬件和操作系統問題。
指示定時器是否基於高分辨率性能 計數器。
StopWatch將使用高分辨率計數器
通過計算計時器在 底層計時器滴答機制經過時間的秒錶措施。如果安裝的硬件和操作系統支持高分辨率性能計數器,則秒錶類使用該計數器來測量已用時間。否則, 秒錶類使用系統計時器來測量已用時間。使用頻率和IsHighResolution字段來確定精確度 和秒錶計時實施的分辨率。
如果您正在測量IO,那麼您的數據可能會受到外部事件的影響,我會擔心這麼多。 正確性(如上所述)。相反,我會採取一系列的測量,並考慮這些數字的均值和分佈。
從個人經驗來看,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
好點+1。感謝您的準確性,爲了簡單起見,我接受了Darin的答案,在這種情況下,準確性處於第二級重要性。 –
@mahditahsildari沒問題。很高興我能幫上忙! :-) – series0ne
我不知道爲什麼這是一個*錯誤*的例子。秒錶正準確地測量第一次通話的總費用,這與將要運行該代碼的客戶確實是相關的。他們並不關心這些132毫秒是用於執行方法還是抖動,他們關心的是總時間。 –
究竟,什麼:我有一個foreach循環,它有一個ThreadPool.QueueUserWorkItem(代理 {CopyFiles(folder,dest); }); '裏面,但秒錶停止一切完成之前。 –
然後,您應該將秒錶放入代表內,以測量CopyFiles方法的性能。 –
@DarinDimitrov - 秒錶不完全準確?記住.NET背景噪音(如JITing)會導致不同的執行時間發生。因此,對於準確的測量,實際上OP應該使用性能分析器。 – series0ne