2012-10-11 110 views
1

我想測試運行一個方法需要多長時間,我想知道時間跨度是否是最好的方法?我不想記錄方法的開始和結束,因爲我聽說由於創建和更新現有日誌文件所需的時間,日誌記錄不會提供準確的時間讀取。如果時間跨度不是最好的方法,那麼有什麼建議可以做到這一點?在C#中使用時間戳測試方法長度

+0

可能要檢查這個問題,太:http://stackoverflow.com/questions/2923283/stopwatch-vs- using-system-datetime-now-for-timing-events – JDB

回答

6

最好使用專爲此類事物設計的Stopwatch類。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Stopwatch stopWatch = new Stopwatch(); 
stopWatch.Start(); 
DoSomething(); 
stopWatch.Stop(); 
// Get the elapsed time as a TimeSpan value. 
TimeSpan ts = stopWatch.Elapsed; 
+1

有趣的文章比較了各種計時方法:http://reflexangle.blogspot.com/2009/04/datetimenow-vs-systemdiagnosticsstopwat.html。 'StopWatch'出現在上面。 – JDB

+0

Ahhhh看起來好多了。謝謝。 – Icebreaker

+0

@ Marino3d - 如果此解決方案已爲您工作,請不要忘記將其標記爲我接受的答案。 –

2

我使用Stopwatch來計算我的代碼。

var sw = new Stopwatch(); 
sw.Start() 
//code to time here 
sw.Stop(); 
Console.WriteLine("Time taken in milliseconds: " + sw.ElapsedMilliseconds); 

你可以通過秒錶獲得漂亮的花式。我用它來測試嵌套執行,以及平均多次循環迭代所花費的時間。

要測試多次反覆做:

var sw = new Stopwatch(); 
List<long> totalTime = new List<long>(); 

for (var u = 0; u < 100000; u++) 
{ 
    sw.Start(); 
    //logic here 
    sw.Stop(); 
    totalTime.Add(sw.ElapsedMilliseconds); 
    sw.Reset(); 
} 
Console.WriteLine("Average time in Milliseconds: {0}", totalTime.Average()); 
2

你想使用秒錶類。

2

您應該使用Stopwatch類:

public void Foo() 
{ 
    var sw = Stopwatch.StartNew(); 
    // Do work... 
    var totalTime = sw.Elapsed; 
} 

我經常讓自己一個實用的方法來處理這個問題:

public static void ComputeTimings(Action method, string methodName) 
{ 
    var sw = Stopwatch.StartNew(); 
    method(); 
    sw.Stop(); 
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed); 
} 

這可以被稱爲:

ComputeTimings(() => Foo(bar), "Foo"); 

這很好,因爲您可以將時間「注入」到您的代碼中並根據需要將其刪除,而無需更改您的實際方法體。

另請注意,對於非常準確的計時,您經常需要執行至少方法兩次。第一次運行方法時,由於JIT編譯器的原因,時序可能會關閉。您可以構建成以上的方法,如果你選擇,即:

public static void ComputeTimings(Action method, string methodName, bool executeOnceFirst = true) 
{ 
    if (executeOnceFirst) 
     method(); 

    var sw = Stopwatch.StartNew(); 
    method(); 
    sw.Stop(); 
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed); 
} 
3
var duration = Measure(() => YourFunction(param1)); 

long Measure(Action action) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    action(); 
    return sw.ElapsedMilliseconds; 
}