System.Diagnostics.Stopwatchはどのくらい正確ですか?さまざまなコードパスに対していくつかのメトリックを実行しようとしていますが、正確である必要があります。ストップウォッチを使用する必要がありますか、それともより正確な別の解決策がありますか。
ストップウォッチが間違った情報を提供することがあると言われています。
System.Diagnostics.Stopwatchはどのくらい正確ですか?さまざまなコードパスに対していくつかのメトリックを実行しようとしていますが、正確である必要があります。ストップウォッチを使用する必要がありますか、それともより正確な別の解決策がありますか。
ストップウォッチが間違った情報を提供することがあると言われています。
ストップウォッチで高い精度 (0.1 ミリ秒以上) を得るには、どのようにテスト セットアップを行う必要があるかを説明する記事を書きました。私はそれがすべてを説明するべきだと思います。
http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx
System.Diagnostics.Stopwatch クラスは経過時間を正確に測定しますが、ElapsedTicks メソッドの動作方法から、実際にはコードに論理エラーがあるだけで、正確ではないという結論に達する人もいます。
一部の開発者がストップウォッチが正確ではないと考える理由は、ストップウォッチの ElapsedTicks が DateTime のティックと一致しないためです。この問題は、アプリケーション コードが ElapsedTicks を使用して新しい DateTime を作成するときに発生します。
var watch = new Stopwatch();
watch.Start();
... (perform a set of operations)
watch.Stop();
var wrongDate = new DateTime(watch.ElapsedTicks); // This is the WRONG value.
必要に応じて、次の方法でストップウォッチの期間を DateTime に変換できます。
// This converts stopwatch ticks into DateTime ticks.
// First convert to TimeSpan, then convert to DateTime
var rightDate = new DateTime(watch.Elapsed.Ticks);
問題をより詳細に説明している記事は次のとおり です。 aspx
まず、物理量の経験的な測定値が正確であると偽ることはできないため、時間や空間について話す場合、正確はもちろん可能または意味のある概念ではありません。
第二に、DavidBoltonのブログ記事が役立つかもしれません。私は引用しています:
これが高解像度カウンターで計時された場合、マイクロ秒の精度になります。実際にはナノ秒(10〜9秒、つまり10億分の1秒)の精度ですが、他にも多くのことが行われているため、ナノ秒の精度は実際には少し無意味です。コードのタイミングまたはベンチマークを実行するときは、多数の実行を実行し、平均時間をかける必要があります。Windowsで実行されている他のプロセス、ディスクへのスワッピングが発生している量などのため、2つの実行間の値は異なる場合があります。
頻度はインストールされているハードウェアとオペレーティングシステムに依存するため、ストップウォッチクラスはさまざまな構成でさまざまな値を返します。
ストップウォッチクラスを使用すると、実行時間の概算しか得られません。また、実行ごとに異なる値を返すため、異なる実行の平均を取る必要があります。
詳細:http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
より正確なタイミングが必要な場合。QueryPerformanceCounter を見てください。QueryPerformanceCounterの MSDN リンク。ここではきちんとした実装を示します。この例では、CE の場合は coredll.dll をロードします。Windows の場合は、MSDN のドキュメントに記載されているように Kernel32.dll をロードする必要があります。
上記のHUAGHAGUAHのアドバイスを支持することに加えて、一般的にマイクロベンチマークには非常に懐疑的であるべきだと付け加えたい. 焦点を絞ったパフォーマンス テストには正当な場所がありますが、重要でない詳細を微調整するのは非常に簡単です。そのため、読みやすさと明確さを考慮して設計されたコードを作成して検証し、プロファイルを作成してホット スポットがどこにあるか (または心配する価値があるかどうか) を調べ、それらの部分 (のみ) を調整します。
システムが人間の入力を待っている間に実行されるコードの一部をマイクロ最適化したプログラマーと一緒に仕事をしたことを思い出します。キーストローク間のラグで、時間の節約は完全になくなりました。
MSDNには、ストップウォッチの例がいくつかあります。彼らはまた、それがナノ秒以内にどれほど正確であるかを示しています。お役に立てれば!
マイクロベンチマークに焦点を当てるのではなく、コードをプロファイリングしないのはなぜですか?
次のような優れたオープン ソース プロファイラーがいくつかあります。