2011-08-08 11 views
31

重複の可能性:
Is DateTime.Now the best way to measure a function's performance?
Stopwatch vs. using System.DateTime.Now for timing events.NETストップウォッチ - パフォーマンスペナルティ

私は可能な限り高速に実行するために必要なコードを持っています。実行時間を記録できるように、私はStopwatchクラスを使用します。私はストップウォッチが悪い方法でパフォーマンスに影響を与えるかもしれないと思う。多分DateTimeの違いを使用する方が効果的でしょうか?

パフォーマンスはどちらが良いと思いますか?

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

// Critical lines of code 

long elapsedMs = se.Elapsed.TotalMilliseconds; 

OR

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

// Critical lines of code 

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

私はどちらも同じ結果をもたらすでしょう。矛盾する違い。 –

+1

参照http://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events – ccellar

+1

参照:http://stackoverflow.com/questions/28637/is-datetime-現時点で最善の方法 - 機能測定 - パフォーマンス - tl; dr:ストップウォッチを使用します。 –

答えて

43

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

+1

Start()とStop()コールの中でStopwatchが何をするのか、これがどのようにアプリケーションに影響するのかという疑問もあります。 VS2013パフォーマンスアナライザは、Stopwatch.Stop()が約0.92%(各アプリケーションの前に80000 sqlクエリ、1thread、sw.Start()/ sw.Stop()を実行する)を無駄にしていることを示しています – mistika

+0

私が探していた説明。 – Neo

1

あなたは秒以下の時間を測定したい場合は、コメント内のリンクは、示しているように私は、その後のDateTime秒1は、限りのパフォーマンスに関しては、より効率的になると思うし、それは効率的ですが正確ではありません

私はStopWatchはDateTimeの1つのインスタンス、すなわちstartTimeを保持するだけのDateTimeと比較して、継続的にチックを測定するためだと思います。

+1

ケアを明確にするには? – ChaosPandion

+0

+1正しい最初の文。現在のDateTimeを取得することは、メモリからカウンタを読み取ることです。しかし、あなたが言うように、パフォーマンスは、ここで考える正確なメトリックではなく、その正確さです。 – nawfal

8

プロファイリングコードが1回だけ実行されるため、そのパフォーマンスへの影響はごくわずかです。内部ループ/クリティカルコードパスの中にストップウォッチを呼び出すのは唯一の問題です。

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

は理論的には、ジッタに何らかの影響があるかもしれませんが、それはそうです。

1

あなたがそれを数回呼び出すだけであれば、本当に問題ではないと思います。しかし、すべてがに依存していますか?のレベルは何ですか? Stopwatchは、QueuePerformanceCounter APIに依存しているため、はるかに正確です。したがって、より高い解像度を使用します。

1

答えは実際にどの精度を達成しようとしているかによって異なります。秒よりも精度が高い場合、ストップウオッチはdatetimeよりも精密な測定システムを使用するため、より良いアプローチです。パフォーマンスの観点からhttp://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

を参照してください 、私は違いの多くがスタート()とDateTime.Nowは、対応する測定システムからの値を格納する方法を見ていることがあり疑うミリ秒を取得する際には、差を計算し対応する測定ユニットに(必要に応じて)変換します

関連する問題