Frage

    

Diese Frage bereits eine Antwort hier:

         

Was ist eine einfache / einfache Art und Weise die Systemuhr mit Hilfe von Java zugreifen, so dass ich die verstrichene Zeit eines Ereignisses berechnen kann?

War es hilfreich?

Lösung

würde ich vermeiden, mit System.currentTimeMillis() für verstrichene Zeit zu messen. currentTimeMillis() gibt die ‚Wand -Clock‘Zeit, die sich ändern können (zB: Sommerzeit, Benutzer admin die Veränderung der Uhr) und skew Ihre Intervallmessungen.

System.nanoTime() , auf der anderen Seite, gibt die Anzahl der Nanosekunden, da ‚einigen Bezugspunkt‘ (zB JVM starten), und würde daher nicht auf Systemuhr Änderungen anfällig sein.

Andere Tipps

Dies ist ein Beispielcode.

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

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");

Apache Commons-Lang hat auch die Stoppuhr-Klasse nur für Ihre Zwecke geeignet ist. Es verwendet System.currentTimeMillis (), so dass Sie immer noch Auflösung Probleme haben, aber Sie können die Rundenzeiten und eine solche Pause und tun. Ich benutze es als Standard jetzt Ereignisstatistiken.

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

Antwort von Leigh korrekt ist.

java.time

Java 8 und später hat sich die java.time Rahmen eingebaut.

Ein Instant ist ein Moment auf der Zeitleiste in UTC mit Nanosekunden-Auflösung (bis zu 9 Ziffern einer dezimalen Bruchteil einer Sekunde). Die now Methode Zupacken der aktuelle Datum-Zeitmoment.

Instant now = Instant.now();
  

2016-03-12T04: 29: 39.123Z

Sie können die verstrichene Zeit zwischen einem Paar von Instant Objekten als Duration . Die Dauer verwendet Nanosekunde Auflösung mit einem Maximalwert der Sekunden an, die in einem langen gehalten werden können. Dies ist größer als das aktuelle geschätzte Alter des Universums.

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

Die Standardausgabe von Duration::toString ist in Standard ISO 8601 Format rel="nofollow. Sie können auch für eine Gesamtzahl von Nanosekunden ( toNanos ) oder Millisekunden ( toMillis ) sowie andere Beträge.

Java 8

In Java 8, das aktuelle Moment Abrufen löst nur Millisekunden Auflösung (bis zu 3 Ziffern einer dezimalen Bruchteil einer Sekunde). Während also die java.time Klassen können speichern ns sie können nur den aktuellen Moment mit Millisekunden bestimmen. Diese Einschränkung ist auf eine Legacy-Ausgabe (der Standard Clock Implementierung verwendet System.currentTimeMillis() ).

Java 9

In Java 9 und höher, kann der Standard Clock Implementierung des aktuellen Moment bestimmen, bis Auflösung bis Nanosekunden. Eigentlich so abhängig von der Uhr Ihres Computers Hardware auf die Feinheit zu tun.

Sehen Sie diese OpenJDK Ausgabe Seite für weitere Informationen: die Genauigkeit der Implementierung von Java erhöhen .time.Clock.systemUTC ()

Micro Benchmark

Wenn Ihr Zweck ist das Benchmarking, sicher sein, in anderen Fragen zu suchen, wie:

Frameworks sind mit Kurzzeit-Benchmarking zu unterstützen.

oder java.lang.System.currentTimeMillis() java.lang.System.nanoTime() funktionieren soll verstrichene Zeit zu messen.

Hier ist eine kleine Stoppuhr-Klasse I die System.nanoTime schrieb () verwendet, wie in der Antwort von Leigh vorgeschlagen:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top