56

イベントの経過時間を計算できるように、Javaを使用してシステム時計にアクセスする簡単で簡単な方法は何ですか?

4

6 に答える 6

84

System.currentTimeMillis()経過時間の測定には使用しないでください。currentTimeMillis()これは変更される可能性があり (例: 夏時間、管理者ユーザーによる時計の変更)、間隔の測定値が歪められる可能性があります。

System.nanoTime()一方、 は、「ある基準点」 (JVM の起動など) からのナノ秒数を返すため、システム クロックの変更の影響を受けません。

于 2008-10-27T11:54:44.703 に答える
27

これはサンプルコードです。

long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
于 2008-10-27T02:28:21.943 に答える
9

Apache Commons-Lang には、目的に適した StopWatch クラスもあります。System.currentTimeMillis() を使用しているため、解決の問題は残りますが、一時停止してラップタイムなどを実行できます。私は現在、イベント統計の標準として使用しています。

http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html

于 2008-10-27T03:58:13.637 に答える
8

リーの答えは正しいです。

java.time

Java 8 以降には、java.time フレームワークが組み込まれています。

anInstantは、UTC のタイムライン上の瞬間であり、ナノ秒の解像度 (1 秒の小数点以下 9 桁まで) です。このnowメソッドは、現在の日時の瞬間を取得します。

Instant now = Instant.now();

2016-03-12T04:29:39.123Z

Instantオブジェクトのペア間の経過時間を として計算できますDuration。持続時間は、long で保持できる秒の最大値でナノ秒の解像度を使用します。これは現在推定されている宇宙の年齢よりも大きい。

Duration duration = Duration.between( startInstant , stopInstant );

のデフォルトの出力Duration::toStringは、標準のISO 8601形式です。toNanosナノ秒 ( ) またはミリ秒( )の合計カウント、toMillisおよびその他の量を要求することもできます。

Java 8

Java 8 では、現在の瞬間の取得はミリ秒の解像度 (1 秒の小数部の最大 3 桁) にのみ解決されます。そのため、java.time クラスはナノ秒を格納できますが、現在の瞬間をミリ秒でしか判断できません。この制限はレガシーの問題によるものです (デフォルトのClock実装では を使用していますSystem.currentTimeMillis())。

Java 9

Java 9 以降では、デフォルトのClock実装により、現在の瞬間を最大ナノ秒の解像度で判別できます。実際にそうするかどうかは、コンピュータのクロック ハードウェアの精度に依存します。

詳細については、この OpenJDK の問題ページを参照してください: java.time.Clock.systemUTC() の実装の精度を上げる

マイクロベンチマーク

目的がベンチマークである場合は、次のような他の質問を確認してください。

短期間のベンチマークを支援するフレームワークが利用可能です。

于 2016-03-16T23:39:18.250 に答える
5

java.lang.System.currentTimeMillis()またはjava.lang.System.nanoTime()経過時間を測定するために働く必要があります。

于 2008-10-27T02:07:56.120 に答える
3

これは、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;
}
于 2012-11-20T16:48:16.843 に答える