78

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

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

4

7 に答える 7

61

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

于 2010-05-10T18:36:38.487 に答える
26

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

クラスなどのいくつかのものはProcess、システムとの対話に役立ちます。Process.Start他のアプリケーションを起動したり、ユーザーのWebサイトを起動したり、ファイルやフォルダーを開いたりすることができます 。

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

名前は気にしないでください。

于 2010-05-10T19:02:47.937 に答える
6

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

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

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

于 2010-05-10T18:41:57.030 に答える
4

Afaik StopWatchは、QueryPerformanceCounter機能のシェルです。この関数は、測定に関連する多くのパフォーマンスカウンターの基礎です。QPFは呼び出しが非常に速く、完全に安全です。Diagnostics名前空間に偏執的であると感じた場合は、QPFを直接呼び出してください。

于 2010-05-10T18:36:22.843 に答える
3

ストップウォッチは基本的に、ネイティブメソッドとメソッドのきちんとしたラッパーです。名前空間の使用に不安がある場合は、これらに直接アクセスできます。QueryPerformanceCounterQueryPerformanceFrequencySystem.Diagnostic

パフォーマンスカウンターの使用は非常に一般的ですが、問題はありません。AFAIK、利用可能なより高いタイマー精度はありません。QPFはマルチプロセッサマシンで問題を引き起こす可能性があることに注意してください。ただし、前にリンクされたMSDNの記事には、それに関する追加情報が記載されています。System.Diagnostics.Stopwatchバックグラウンドでそれを行うか、手動で呼び出すことをお勧めしSetThreadAffinityます-そうしないと、タイマーが時間に戻る可能性があります!

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

于 2010-05-10T18:37:08.777 に答える
3

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

これは、MSDNマガジンからのこのテーマに関する優れた記事です(.NET Frameworkクラスライブラリのタイマークラスの比較)。

于 2010-05-10T18:37:34.867 に答える
0

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

于 2010-05-10T18:43:27.187 に答える