64

重複の可能性:
DateTime.Now は関数のパフォーマンスを測定する最良の方法ですか?
ストップウォッチとタイミング イベントの System.DateTime.Now の使用

できるだけ速く実行する必要があるコードがあります。実行時間を記録するには、Stopwatchクラスを使用します。ストップウォッチがパフォーマンスに悪い影響を与えるのではないかと思います。たぶん、DateTime の違いを使用する方が効果的でしょうか?

性能的にはどちらが優れていると思いますか?

Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;

// Critical lines of code

long elapsedMs = se.Elapsed.TotalMilliseconds;

また

DateTime startDate = DateTime.Now;
int a = 5;

// Critical lines of code

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds;
4

5 に答える 5

93

はとStopwatchの呼び出しの間は何もしません。起動時に現在のタイムスタンプを ( 経由で) 保存し、停止すると現在のタイムスタンプと比較するだけです。したがって、コードのパフォーマンスに影響を与える可能性がある理由はありません。少なくとも、それほど大きくはありません。正確な時間測定のために特別に設計されているため、完全に最適化されていることを確認できます。また、 の連続する値を比較するよりもはるかに正確です。...StartStopQueryPerformanceCounterStopwatchDateTime.Now

于 2011-08-08T17:49:52.303 に答える
10

プロファイリングコードは1回だけ実行されるため、パフォーマンスへの影響はごくわずかです。あなたがあなたの内側のループ/重要なコードパスの中にストップウォッチへの呼び出しを置くならば、それはただ問題です。

GetTickCount()プロファイリングの最速の方法の1つであるはずですが、精度は数ミリ秒しかありません。Windows API関数はGetTickCount()、単純な変数(数ミリ秒ごとに更新される)のみをチェックします。そのコストは、ネイティブメソッド呼び出しのコストであり、それ以上のものではありません。.NETのように公開さEnvironment.TickCountれます。しかし、私が言ったように、私はこれが重要であるとは思えません。と同じ(低い)精度を持ちます。DateTime.UtcNow/NowGetTickCount

理論的には、ジッターに何らかの影響がある可能性がありますが、それはありそうにありません。

于 2011-08-08T17:41:44.620 に答える
3

答えは、達成しようとしている精度によって異なります。秒を超える精度の場合、日時よりも正確な測定システムを使用するため、ストップウォッチの方が適しています。http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspxを参照してください。

パフォーマンスの観点からは、Start() と DateTime.Now が対応する測定システムから値を格納する方法と、ミリ秒を取得するときに差を計算して (必要に応じて) に変換する方法を見て、それほど大きな違いがあるとは思えません。対応する測定単位

于 2011-08-08T17:50:32.997 に答える
2

数回だけ呼び出す場合は、それほど重要ではないと思います。ただし、すべては、要求する精度のレベルに依存します。StopwatchAPIに依存しているため、はるかに正確でありQueuePerformanceCounter、より高い解像度を使用します。

于 2011-08-08T17:42:56.900 に答える
1

パフォーマンスに関する限り、2番目の方が効率的であると思います。コメントのリンクが示すように、秒未満の時間を測定したい場合、DateTimeは効率的ですが正確ではありません

私がそう思うのは、DateTime の 1 つのインスタンス、つまり startTime のみを保持する DateTime と比較して、StopWatch が目盛りを継続的に測定するためです。

于 2011-08-08T17:39:14.897 に答える