Comment calculer le temps écoulé d’un événement en Java?

Quel est un moyen simple / facile d’accéder à l’horloge du système en utilisant Java, afin que je puisse calculer le temps écoulé d’un événement?

System.currentTimeMillis() utiliser System.currentTimeMillis() pour mesurer le temps écoulé. currentTimeMillis() renvoie l’heure de l’horloge, qui peut changer (par exemple: heure d’été, changement de l’horloge par l’administrateur) et fausser les mesures d’intervalle.

System.nanoTime() , en revanche, renvoie le nombre de nanosecondes depuis «certains points de référence» (par exemple, démarrage de la JVM) et ne serait donc pas susceptible de subir des modifications d’horloge système.

Ceci est un exemple de code.

 long startTime = System.currentTimeMillis(); // Run some code; long stopTime = System.currentTimeMillis(); System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds."); 

Apache Commons-Lang a également la classe StopWatch adaptée à vos besoins. Il utilise System.currentTimeMillis (), donc vous aurez toujours des problèmes de résolution, mais vous pouvez faire une pause et faire des temps au tour et autres. Je l’utilise maintenant pour les statistiques des événements.

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

La réponse de Leigh est correcte.

java.time

Java 8 et versions ultérieures intègrent le framework java.time.

Un Instant est un moment de la chronologie en UTC avec une résolution en nanosecondes (jusqu’à 9 chiffres d’une fraction décimale de seconde). La méthode now saisit le moment date-heure actuel.

 Instant now = Instant.now(); 

2016-03-12T04: 29: 39.123Z

Vous pouvez calculer le temps écoulé entre une paire d’objects Instant tant que Duration . La durée utilise une résolution en nanosecondes avec une valeur maximale des secondes pouvant être conservée sur une longue période. Ceci est supérieur à l’âge estimé actuel de l’univers.

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

La sortie par défaut de Duration::toSsortingng est au format ISO 8601 standard. Vous pouvez également demander un nombre total de nanosecondes ( toNanos ) ou millisecondes ( toMillis ), ainsi que d’autres montants.

Java 8

En Java 8, l’extraction de l’instant actuel ne résout que la résolution d’une milliseconde (jusqu’à trois chiffres d’une fraction décimale de seconde). Ainsi, même si les classes java.time peuvent stocker des nanosecondes, elles ne peuvent déterminer que le moment en millisecondes. Cette limitation est due à un problème hérité (l’implémentation de l’ Clock par défaut utilise System.currentTimeMillis() ).

Java 9

Dans Java 9 et les versions ultérieures, l’implémentation par défaut de l’ Clock peut déterminer le moment actuel jusqu’à une résolution allant jusqu’à la nanoseconde. En fait, cela dépend de la finesse du matériel d’horloge de votre ordinateur.

Voir cette page de problème OpenJDK pour plus d’informations: Augmentez la précision de l’implémentation de java.time.Clock.systemUTC ()

Micro Benchmark

Si votre objective est l’parsing comparative, veillez à examiner d’autres questions telles que:

  • Comment écrire un micro-benchmark correct en Java?
  • Créer un benchmark rapide / fiable avec java?

Les frameworks sont disponibles pour aider à l’parsing comparative de courte durée.

java.lang.System.currentTimeMillis() ou java.lang.System.nanoTime() doivent fonctionner pour mesurer le temps écoulé.

Voici une petite classe StopWatch que j’ai écrite en utilisant System.nanoTime () comme suggéré dans la réponse de Leigh:

 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; }