101

コードのパフォーマンスを追跡したかったので、を使用して開始時刻と終了時刻を保存しましたSystem.DateTime.Now。この2つの違いを、コードを実行する時間として使用しました。

違いが正確に見えないことに気づきました。そこで、Stopwatchオブジェクトを使ってみました。これははるかに正確であることが判明しました。

Stopwatch誰かが、開始時間と終了時間の差を使用して計算するよりも正確である理由を教えてもらえますSystem.DateTime.Nowか?

ところで、私は10分の1パーセントについて話しているのではありません。約15〜20%の違いがあります。

4

3 に答える 3

84

MSDNによると:

ストップウォッチは、基礎となるタイマーメカニズムのタイマーティックをカウントすることで経過時間を測定します。インストールされているハードウェアとオペレーティングシステムが高解像度のパフォーマンスカウンターをサポートしている場合、Stopwatchクラスはそのカウンターを使用して経過時間を測定します。それ以外の場合、Stopwatchクラスはシステムタイマーを使用して経過時間を測定します。FrequencyフィールドとIsHighResolutionフィールドを使用して、ストップウォッチタイミング実装の精度と解像度を決定します。

よりも高い解像度/精度を使用しDateTime.Nowます。

これらの関連リンクも確認できます。

Environment.TickCountとDateTime.Now

DateTime.Nowは、関数のパフォーマンスを測定するための最良の方法ですか?

DateTimeおそらく秒までの精度には十分ですが、それを超えるものはお勧めしStopWatchます。

于 2010-05-27T17:24:52.810 に答える
35

DateTime値を減算するよりもはるかに正確であるため、Stopwatchクラスを使用することをお勧めします。

Stopwatch s = Stopwatch.StartNew();
// Tested code here
s.Stop();
Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);

残念ながら、この単純なコードでは、OSの内部で多くのアクティビティが発生しているため、ほとんどの場合、正確な測定値を取得するのに十分ではありません。これにより、CPU時間が奪われ、コードの実行が遅くなる可能性があります。そのため、テストを複数回実行してから、最低回数と最高時間を削除するのが最適です。そのpuproseの場合、テストされたコードを複数回実行し、最小時間と最大時間を削除して平均時間を計算するメソッドを用意することをお勧めします。ブログにサンプルのテスト方法を公開しました。

于 2012-07-06T09:49:55.777 に答える
8

このタイミング関数のパフォーマンスリンクでは、正確な問題、特にこの段落について説明しています。

問題は、MSDNによると、DateTime.Now関数の解像度が10ミリ秒以上であり、2回呼び出す必要があることです。したがって、実行時の測定に20ミリ秒以上のスイングが発生します。私たちの関数呼び出しは、この20ミリ秒のウィンドウよりもはるかに速く戻る可能性が高いため、これでは十分ではありません。

編集:それは一種の2番目のDateTimeのように聞こえます。現在、ストップウォッチメソッドが終了するときとは異なる時間に呼び出されています。

于 2010-05-27T17:28:15.020 に答える