簡體   English   中英

計算方法的執行時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM