web-dev-qa-db-ja.com

ストップウォッチを量産コードで使用できますか?

正確なタイマーが必要ですが、DateTime.Nowは十分に正確ではないようです。私が読んだ説明から、System.Diagnostics.Stopwatchはまさに私が望んでいるようです。

しかし、私には恐怖症があります。実際の製品コードでSystem.Diagnosticsの何かを使用することに不安を感じています。 (私はAssertsやPrintLnsなどを使用したデバッグに広く使用していますが、まだ本番環境には使用していません。)私は単にタイマーを使用して関数のベンチマークを試みているだけではなく、アプリには実際のタイマーが必要です。別のフォーラムで、System.Diagnostics.StopWatchはベンチマークのためだけであり、理由は示されていないものの、小売りコードでは使用しないでくださいと読んだことがあります。これは正しいですか、または私(およびそのアドバイスを投稿した人)はSystem.Diagnosticsにあまりにも心を閉じていますか?つまり、量産コードでSystem.Diagnostics.Stopwatchを使用しても問題ありませんか?ありがとうエイドリアン

74
Adrian

内部的には、ストップウォッチが行うことのほとんどすべてがラップ QueryPerformanceCounter です。私が理解しているように、ストップウォッチは高解像度タイマーへのアクセスを提供するためにあります-本番コードでこの解像度が必要な場合、それを使用しても何も問題はありません。

59
Steve Dennis

はい、 System.Diagnosticsは、デバッグ専用のように聞こえますが、名前に惑わされないでください。 System.Diagnostics名前空間は、最初は量産コードで使用するのに少し怖いように思えるかもしれません(私にとってはそうでした)が、その名前空間にはたくさんの便利なものがあります。

Processクラスなど、システムとのやり取りに役立つものがあります。 Process.Start他のアプリケーションを起動したり、ユーザーのウェブサイトを起動したり、ファイルやフォルダを開いたりできます。

Traceクラスなどの他のものは、プロダクションコードのバグを追跡するのに役立ちます。確かに、本番コードでそれらを常に使用するわけではありませんが、リモートマシンでのとらえどころのないバグをログに記録して追跡するのに役立ちますvery

名前を気にする必要はありません。

23
Zach Johnson

あなたは本番環境でSystem.Diagnosticsのクラスを使用しないように別のフォーラムで読んだと言います。しかし、心配する必要がある唯一のソースは、コードを作成したMicrosoftです。 StopWatch class

経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。

彼らは「生産を除いて」とは言いません。

5
John Saunders

Afaik StopWatchは QueryPerformanceCounter 機能のシェルです。この関数は、多くのパフォーマンスカウンターに関連する測定の基礎です。 QPFは呼び出しが非常に速く、完全に安全です。 Diagnosticsネームスペースに偏執感がある場合は、QPFを直接呼び出します。

4
Remus Rusanu

ストップウォッチは、ネイティブ QueryPerformanceCounter およびQueryPerformanceFrequencyメソッドの周りの 基本的にはきちんとしたラッパー です。 _System.Diagnostic_名前空間を使いたくない場合は、 これらに直接アクセス できます。

パフォーマンスカウンターの使用は非常に一般的ですが、何も問題はありません。私の知る限り、利用可能なより高いタイマー精度はありません。 QPFはマルチプロセッサマシンで問題を引き起こす可能性がありますが、前にリンクされたMSDNの記事はそれに関する追加情報を提供しています。 _System.Diagnostics.Stopwatch_がバックグラウンドで実行することを確認するか、SetThreadAffinityを手動で呼び出すことをお勧めします。そうしないと、タイマーが時間内にジャンプする可能性があります

非常に高精度の測定の場合、考慮に入れる必要がある いくつかの微妙な点 があることに注意してください。これだけの精度が必要な場合は、問題になる可能性があります。

3
mnemosyn

.NET基本クラスライブラリにはいくつかの異なるタイマークラスがあり、どれがユーザーのニーズに最も適しているかはユーザーが決定する必要があります。

この件に関するMSDNマガジンの優れた記事(.NET Frameworkクラスライブラリのタイマークラスの比較)

3
Oded

タイマーを何に使用しているかによって、考慮すべき他の問題が発生する場合があります。 Windowsは実行のタイミングを保証していません。そのため、リアルタイム処理をこれに依存しないでください(ハードリアルタイムスケジューリングを提供するWindows用のリアルタイム拡張機能があります)。また、時間間隔をキャプチャした後、その精度に依存する何かを行う前に、コンテキストの切り替えの結果として精度が失われる可能性があると思います。原則として、これは任意の長い期間になる可能性があります。実際には、ミリ秒のオーダーでなければなりません。それは本当にこのタイミングがミッションクリティカルであるかに依存します。

0
Dan Bryant