web-dev-qa-db-ja.com

System.Diagnostics.Stopwatchはどのくらい正確ですか?

System.Diagnostics.Stopwatchはどのくらい正確ですか?さまざまなコードパスに対していくつかのメトリックを実行しようとしていますが、正確である必要があります。ストップウォッチを使用する必要がありますか、それともより正確な別の解決策がありますか。

ストップウォッチが間違った情報を提供することがあると言われています。

28
leora

マイクロベンチマークに焦点を合わせる代わりに、コードのプロファイルを作成しないのはなぜですか?

次のような優れたオープンソースプロファイラーがいくつかあります。

1
CMS

ストップウォッチから高精度(0.1ms以上)を引き出すためにテストセットアップを行う方法を説明する記事を書いたところです。私はそれがすべてを説明するべきだと思います。

http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx

20

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); 

問題をより詳細に説明する記事は次のとおりです。 http://geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not- timespan-ticks.aspx

7
user3308241

まず、exactは、時間や空間について話すときはもちろん、可能で意味のある概念ではありません。物理量の経験的な測定では、そのふりをすることはできないからです。正確。

第二に、 David Bolton のブログ記事が役立つかもしれません。私は引用しています:

これが高解像度カウンターで計時された場合、マイクロ秒の精度になります。実際にはナノ秒(10〜9秒、つまり10億分の1秒)の精度ですが、他にも多くのことが行われているため、ナノ秒の精度は実際には少し無意味です。コードのタイミングまたはベンチマークを実行するときは、多数の実行を実行し、平均時間をかける必要があります。Windowsで実行されている他のプロセス、ディスクへのスワップの量などのため、2つの実行間の値は異なる場合があります。

3
Daniel Daranas

頻度はインストールされているハードウェアとオペレーティングシステムに依存するため、ストップウォッチクラスは異なる構成で異なる値を返します。

ストップウォッチクラスを使用すると、実行時間の概算しか得られません。また、実行ごとに異なる値が返されるため、異なる実行の平均を取る必要があります。

詳細: http://msdn.Microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

2
Aditya Acharya

より正確なタイミングが必要な場合。 QueryPerformanceCounterを見てください。 QueryPerformanceCounter のMSDNリンク。きちんとした実装が与えられます ここ 。この例では、CEの場合はcoredll.dllをロードしますが、Windowsの場合は、MSDNドキュメントに記載されているようにKernel32.dllをロードする必要があります。

1
kernelman

MSDNには いくつかの例 ストップウォッチがあります。彼らはまた、それがナノ秒以内にどれほど正確であるかを示しています。お役に立てれば!

0
Jab

上記のHUAGHAGUAHのアドバイスを支持することに加えて、私はあなたが一般的にマイクロベンチマークに非常に懐疑的であるべきだと付け加えます。焦点を絞ったパフォーマンステストには正当な場所がありますが、重要でない詳細を微調整するのは非常に簡単です。したがって、読みやすさと明確さのために設計されたコードを記述して検証し、それをプロファイリングしてホットスポットがどこにあるか(またはそこにあるかどうかある心配する価値があるかどうか)を見つけ、それらの部分を(のみ)調整します。

システムが人間の入力を待っている間に実行されるコードのビットをマイクロ最適化したプログラマーと一緒に働いたことを思い出します。キーストローク間のラグで時間の節約は完全になくなりました!

0
joel.neely