javaでイベントの経過時間を計算するにはどうすればよいですか? [複製]
質問
この質問にはすでに回答があります:
イベントの経過時間を計算できるように、Javaを使用してシステムクロックにアクセスする簡単で簡単な方法は何ですか?
解決
経過時間を測定するためのSystem.currentTimeMillis()
。 currentTimeMillis()
は「壁時計」時間を返します。これは変更される場合があり(例:夏時間、管理者ユーザーが時計を変更する)、間隔の測定値をゆがめます。
System.nanoTime ()
は、一方で、「ある基準点」(たとえば、JVMの起動)からのナノ秒数を返します。したがって、システムクロックの変更の影響を受けません。
他のヒント
これはサンプルコードです。
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Apache Commons-Langには、目的に合ったStopWatchクラスもあります。 System.currentTimeMillis()を使用しているため、解像度の問題は引き続き発生しますが、一時停止してラップタイムなどを行うことができます。現在、イベント統計の標準として使用しています。
http:// commons。 apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
Answer by Leigh は正しいです。
java.time
Java 8以降には、java.timeフレームワークが組み込まれています。
Instant
は、ナノ秒の解像度(秒の小数部の9桁まで)のUTCでのタイムライン上の瞬間です。 now
メソッドは現在の日時を取得します。
Instant now = Instant.now();
2016-03-12T04:29:39.123Z
Instant
オブジェクトのペア間の経過時間を 期間
。期間は、ナノ秒の解像度を使用し、長時間保持できる最大秒数を使用します。これは、宇宙の現在の推定年齢よりも大きいです。
Duration duration = Duration.between( startInstant , stopInstant );
<のデフォルト出力code> Duration :: toString は標準の ISO 8601 形式。ナノ秒の合計カウントを求めることもできます( toNanos
)またはミリ秒( toMillis
)、およびその他の金額。
Java 8
Java 8では、現在の瞬間を取得すると、ミリ秒の解像度(1秒の小数部で最大3桁)しか解決されません。そのため、java.timeクラスはナノ秒単位で保存できますが、ミリ秒単位で現在の瞬間しか判断できません。この制限は、従来の問題(デフォルトの < code> Clock の実装では、 System.currentTimeMillis()
)。
Java 9
Java 9以降では、デフォルトの Clock
実装が現在の瞬間を最大ナノ秒の解像度で決定できます。実際にそうするかどうかは、コンピューターのクロックハードウェアの細さに依存します。
詳細については、このOpenJDKの問題のページを参照してください: Javaの実装の精度を上げる.time.Clock.systemUTC()
マイクロベンチマーク
目的がベンチマークである場合、次のような他の質問を必ず確認してください。
短期間のベンチマークを支援するフレームワークが利用可能です。
java.lang.System.currentTimeMillis()
または java.lang.System.nanoTime()
は、経過時間を測定するために機能するはずです。
これは、Leighからの回答で示唆されているように、System.nanoTime()を使用して作成した小さなStopWatchクラスです。
public class StopWatch {
// Constructor
public StopWatch() {
}
// Public API
public void start() {
if (!_isRunning) {
_startTime = System.nanoTime();
_isRunning = true;
}
}
public void stop() {
if (_isRunning) {
_elapsedTime += System.nanoTime() - _startTime;
_isRunning = false;
}
}
public void reset() {
_elapsedTime = 0;
if (_isRunning) {
_startTime = System.nanoTime();
}
}
public boolean isRunning() {
return _isRunning;
}
public long getElapsedTimeNanos() {
if (_isRunning) {
return System.nanoTime() - _startTime;
}
return _elapsedTime;
}
public long getElapsedTimeMillis() {
return getElapsedTimeNanos() / 1000000L;
}
// Private Members
private boolean _isRunning = false;
private long _startTime = 0;
private long _elapsedTime = 0;
}