Comment calculer le temps écoulé d'un événement en java? [dupliquer]
cette question a déjà une réponse ici:
Qu'est-ce qu'un moyen simple/facile d'accéder à L'horloge du système en utilisant Java, de sorte que je puisse calculer le temps écoulé d'un événement?
6 réponses
j'éviterais d'utiliser System.currentTimeMillis()
pour mesurer le temps écoulé. currentTimeMillis()
renvoie l'Heure "de l'horloge murale", qui peut changer (par exemple: changement de jour, changement de l'horloge par l'utilisateur administrateur) et modifier vos mesures d'intervalle.
System.nanoTime()
, d'autre part, renvoie le nombre de nanosecondes depuis "un point de référence" (par exemple, démarrage de L'entreprise commune), et ne serait donc pas susceptible de système de modifications de l'horloge.
c'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 de Chronomètre adapté juste pour votre but. Il utilise le système.currentTimeMillis (), de sorte que vous aurez toujours des problèmes de résolution, mais vous pouvez faire une pause et faire des tours de temps et ainsi de suite. Je l'utilise maintenant comme standard pour les statistiques d'événements.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
Le Répondre par Leigh est correct.
de java.time
Java 8 et plus tard a le java.temps cadre intégré.
Un Instant
est un moment dans le scénario de l'UTC avec une résolution d'une (jusqu'à 9 chiffres de la partie décimale d'une fraction de seconde). La méthode now
saisit le moment courant date-heure.
Instant now = Instant.now();
2016-03-12T04: 29:39.123 Z
vous pouvez calculer le temps écoulé entre une paire d'objets Instant
comme un Duration
. La durée utilise une résolution d'une valeur maximale de l'secondes qui peut être tenu dans une longue. C'est plus grand que l'âge actuel estimé de l'univers.
Duration duration = Duration.between( startInstant , stopInstant );
la sortie par défaut de Duration::toString
est en standard format ISO 8601 . Vous pouvez aussi demander un total de nanosecondes ( toNanos
) ou des millisecondes ( toMillis
), ainsi que d'autres montants.
Java 8
Dans Java 8, extraction à l'heure actuelle résout uniquement à la milliseconde (jusqu'à 3 chiffres de la partie décimale d'une fraction de seconde). Alors, pendant la java.les classes de temps peuvent stocker nanosecondes ils ne peuvent déterminer à l'heure actuelle, avec millisecondes. Cette limitation est due à un problème d'héritage (la valeur par défaut Clock
l'implémentation utilise System.currentTimeMillis()
).
Java 9
en Java 9 et plus tard, l'implémentation par défaut Clock
peut déterminer le moment actuel jusqu'à une résolution de nanoseconde. En fait cela dépend de la finesse de l'horloge de votre ordinateur matériel.
voir cette page d'édition OpenJDK pour plus d'informations: augmenter la précision de l'implémentation de java.temps.Horloge.systemUTC ()
Micro De Référence
si votre but est l'analyse comparative, assurez-vous d'examiner d'autres Questions telles que:
des cadres sont disponibles pour aider à l'étalonnage de courte durée.
java.lang.System.currentTimeMillis()
ou java.lang.System.nanoTime()
doit servir à mesurer le temps écoulé.
Voici une petite classe de chronomètre que j'ai écrite en utilisant le système.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;
}