可能な重複:
関数の実行時間をどのように測定しますか
ある場所から別の場所にデータをコピーするI/O時間がかかる方法があります。実行時間を計算するための最善かつ最も現実的な方法は何ですか? Thread
? Timer
? Stopwatch
?他の解決策はありますか?私は最も正確なものが欲しくて、そして可能な限り最も明るいです。
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の概要が含まれています。
個人的な経験から、メソッドの実行時間を測定するために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でのパフォーマンスプロファイリング
StopWatch
classはあなたの最善の解決策を探します。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
Stopwatch.IsHighResolution
という名前の静的フィールドもあります。もちろん、これはハードウェアとオペレーティングシステムの問題です。
タイマーが高解像度パフォーマンスカウンターに基づいているかどうかを示します。
あなたがパフォーマンスを理解することに興味があるなら、最良の答えはプロファイラーを使うことです。
それ以外の場合、 System.Diagnostics.StopWatch は高解像度タイマーを提供します。
StopWatch 高解像度カウンターを使用します
ストップウォッチは、基礎となるタイマーメカニズムでタイマーティックをカウントすることによって経過時間を測定します。インストールされているハードウェアとオペレーティングシステムが高解像度のパフォーマンスカウンタをサポートしている場合、Stopwatchクラスはそのカウンタを使用して経過時間を測定します。それ以外の場合、Stopwatchクラスはシステムタイマーを使用して経過時間を測定します。 FrequencyフィールドとIsHighResolutionフィールドを使用して、ストップウォッチタイミング実装の精度と分解能を決定します。
あなたがIOを測定しているなら、あなたの数字はおそらく外部の出来事の影響を受けるでしょう、そして私はとても心配します。 正確さ (上記のとおり)代わりに、私は一連の測定値を取り、それらの数値の平均と分布を考えます。
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;