重複の可能性:
関数の実行時間を測定するにはどうすればよいですか?
ある場所から別の場所にデータをコピーするI / O時間のかかる方法があります。実行時間を計算するための最良かつ最も現実的な方法は何ですか?Thread
?Timer
?Stopwatch
?他の解決策はありますか?私は最も正確で、できるだけ短いものを求めています。
重複の可能性:
関数の実行時間を測定するにはどうすればよいですか?
ある場所から別の場所にデータをコピーする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で指摘されているように、一部のコードの実行を正確に測定するには、オペレーティングシステムに組み込まれているパフォーマンスカウンターを使用する必要があります。以下の答えは、素敵な概要が含まれています。
個人的な経験から、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プロファイラーとは
また、ストップウォッチを使用したパフォーマンスプロファイリングに関する記事も書いています-.NETでのパフォーマンスプロファイリング
StopWatch
クラスはあなたの最善の解決策を探します。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
また、という静的フィールドがありますStopwatch.IsHighResolution
。もちろん、これはハードウェアとオペレーティングシステムの問題です。
タイマーが高解像度パフォーマンスカウンターに基づいているかどうかを示します。
パフォーマンスの理解に興味がある場合は、プロファイラーを使用するのが最善の方法です。
それ以外の場合、System.Diagnostics.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);
}
}
ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); });
内部にforeachループがありますが、ストップウォッチはすべてが完了する前に停止します。