7

私は単純な Java プログラムを持っており、一連の操作間の時間差を知りたいと思っています。この質問では詳細は重要ではありませんが、次のシナリオを考えてみましょう。

long beginTime = System.currentTimeMillis();

//Some operations. Let us asssume some database operations etc. which are time consuming.

//

long endTime = System.currentTimeMillis();

long difference = endTime - beginTime;

コードがマシン上で実行されたとき、違いはどの程度信頼できるでしょうか?

プロセッサが私のコードからいくつかの命令の実行を開始し、別のプロセスにコンテキストを与え、それがしばらく実行された後、この Java プロセスに関連する命令を実行するために戻ってくるとします。

したがって、時間差はマシンの現在の状態、つまり実行中のプロセスの数などに依存するはずです。では、一部の操作の実行にかかるプロファイリング時間において、このメカニズムは信頼できないのでしょうか?

4

2 に答える 2

13

の粒度はSystem.currentTimeMillis()実装とオペレーティング システムによって異なり、通常は約 10 ミリ秒です。

代わりに、使用System.nanoTime()可能な最も正確なシステム タイマーの現在の値をナノ秒単位で返す を使用します。これは経過時間の計算にのみ使用できることに注意してください。その値を絶対時間として使用することはできません。

例:

long startTime = System.nanoTime();
// do something you want to measure
long elapsedTimeNs = System.nanoTime() - startTime;
于 2012-10-25T05:57:24.443 に答える
2

同じものがいくつかのプロジェクトで使用されているので、あなたのコードはうまくいくと思います。あなたのコードが他のデータベースプロセスなどを呼び出しても、それがあなたの時間に影響を与えるとは思いません。その場合もうまくいくはずです。

元。

Main Process Started
long beginTime = System.currentTimeMillis();
.
.
.
Called another process (DB or command etc) -> (Another Process start)
                                               .
<Now in this time main process is waiting>     .
                                               .
                                               .
Returned from process                      <- (Another Process end)
.
.
long endTime = System.currentTimeMillis();
long difference = endTime - beginTime;

この差は、別のプロセスにかかった時間を含むメイン プロセスにかかった合計時間になります。このタイミングは、メイン プロセスのマシンを基準にしており、問題ありません。

于 2012-10-25T06:14:56.257 に答える