web-dev-qa-db-ja.com

メソッドの実行時間を計算する

可能な重複:
関数の実行時間をどのように測定しますか

ある場所から別の場所にデータをコピーするI/O時間がかかる方法があります。実行時間を計算するための最善かつ最も現実的な方法は何ですか? ThreadTimerStopwatch?他の解決策はありますか?私は最も正確なものが欲しくて、そして可能な限り最も明るいです。

453

Stopwatch はこの目的のために設計されており、.NETでの時間実行を測定するための最良の方法の1つです。

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

しない .NETで時間の実行を測定するためにDateTime を使用する。


更新:

コメントセクションの@ series0neで指摘されているように、コードの実行を正確に測定するには、オペレーティングシステムに組み込まれているパフォーマンスカウンタを使用する必要があります。 次の答え にはNiceの概要が含まれています。

919
Darin Dimitrov

個人的な経験から、メソッドの実行時間を測定するために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

今、あなたは疑問に思います。 "最初に132msかかり、残りの時間が大幅に短縮されたのはどうしてですか?" _

その答えは、Stopwatchは、JITingのような.NETでの「バックグラウンドノイズ」アクティビティを補正しないということです。したがって、初めてメソッドを実行するときには、.NET JITが最初に実行されます。これを行うのにかかる時間は実行の時間に追加されます。同様に、他の要因によっても実行時間が変動します。

絶対精度を実際に探しているのは、 パフォーマンスプロファイリング !です。

以下を見てください。

RedGate ANTS Performance Profilerは商用製品ですが、非常に正確な結果をもたらします。 - .NETプロファイリングでアプリケーションのパフォーマンスを向上させる

ここにプロファイリングに関するStackOverflowの記事があります: - いくつかの良い.NETプロファイラは何ですか?

また、Stopwatchを使用したパフォーマンスプロファイリングに関する記事も書いてあります。 - .NETでのパフォーマンスプロファイリング

62
series0ne

StopWatch classはあなたの最善の解決策を探します。

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

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

Stopwatch.IsHighResolution という名前の静的フィールドもあります。もちろん、これはハードウェアとオペレーティングシステムの問題です。

タイマーが高解像度パフォーマンスカウンターに基づいているかどうかを示します。

24
Soner Gönül

あなたがパフォーマンスを理解することに興味があるなら、最良の答えはプロファイラーを使うことです。

それ以外の場合、 System.Diagnostics.StopWatch は高解像度タイマーを提供します。

17
Jeff Foster

StopWatch 高解像度カウンターを使用します

ストップウォッチは、基礎となるタイマーメカニズムでタイマーティックをカウントすることによって経過時間を測定します。インストールされているハードウェアとオペレーティングシステムが高解像度のパフォーマンスカウンタをサポートしている場合、Stopwatchクラスはそのカウンタを使用して経過時間を測定します。それ以外の場合、Stopwatchクラスはシステムタイマーを使用して経過時間を測定します。 FrequencyフィールドとIsHighResolutionフィールドを使用して、ストップウォッチタイミング実装の精度と分解能を決定します。

あなたがIOを測定しているなら、あなたの数字はおそらく外部の出来事の影響を受けるでしょう、そして私はとても心配します。 正確さ (上記のとおり)代わりに、私は一連の測定値を取り、それらの数値の平均と分布を考えます。

7
Brian Agnew
 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);
   }
 }

この目的のためにEnvironment.TickCountプロパティを使用しました。

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0