[英]Calculate the execution time of a method
可能的重復:
我如何衡量一個函數運行了多長時間?
我有一個 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;
不要使用 DateTime來測量 .NET 中的時間執行。
更新:
正如@series0ne 在評論部分指出的那樣:如果您想要真正精確地測量某些代碼的執行情況,則必須使用操作系統內置的性能計數器。 以下答案包含一個很好的概述。
從個人的經驗, System.Diagnostics.Stopwatch
類可用於測量方法的執行時間,但要注意:這是不完全准確!
考慮以下示例:
Stopwatch sw;
for(int index = 0; index < 10; index++)
{
sw = Stopwatch.StartNew();
DoSomething();
Console.WriteLine(sw.ElapsedMilliseconds);
}
sw.Stop();
示例結果
132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms
現在你想知道; “好吧,為什么第一次需要 132 毫秒,而其余時間明顯更少?”
答案是, Stopwatch
不會補償 .NET 中的“背景噪音”活動,例如 JITing。 因此,第一次運行您的方法時,首先是 .NET JIT。 執行此操作所需的時間會添加到執行時間中。 同樣,其他因素也會導致執行時間發生變化。
您真正應該尋找絕對准確性的是性能分析!
看看以下內容:
RedGate ANTS Performance Profiler 是一種商業產品,但產生的結果非常准確。 - 使用 .NET 分析提高應用程序的性能
這是一篇關於分析的 StackOverflow 文章: - 什么是好的 .NET 分析器?
我還寫了一篇關於使用秒表進行性能分析的文章,您可能想看看 - .NET 中的性能分析
StopWatch
類尋找您的最佳解決方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
它還有一個名為Stopwatch.IsHighResolution
的靜態字段。 當然,這是硬件和操作系統的問題。
指示計時器是否基於高分辨率性能計數器。
如果您有興趣了解性能,最好的答案是使用分析器。
否則, System.Diagnostics.StopWatch提供高分辨率計時器。
秒表將使用高分辨率計數器
秒表通過計算底層計時器機制中的計時器滴答來測量經過的時間。 如果安裝的硬件和操作系統支持高分辨率性能計數器,則 Stopwatch 類使用該計數器來測量經過的時間。 否則,秒表類使用系統計時器來測量經過的時間。 使用 Frequency 和 IsHighResolution 字段來確定秒表計時實現的精度和分辨率。
如果您正在測量 IO,那么您的數字可能會受到外部事件的影響,我會非常擔心。 准確性(正如您在上面指出的那樣)。 相反,我會進行一系列測量並考慮這些數字的平均值和分布。
遵循此Microsoft Doc :
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}
輸出: RunTime 00:00:09.94
using System.Diagnostics;
class Program
{
static void Test1()
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine("Test1 " + i);
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Test1();
sw.Stop();
Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.