Quel est le moyen le plus simple d'accéder à l'horloge du système en utilisant Java, afin de pouvoir calculer le temps écoulé d'un événement ?
Réponses
Trop de publicités?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 d'heure, changement d'horloge par l'administrateur) et fausser vos mesures d'intervalle.
System.nanoTime(), quant à lui, renvoie le nombre de nanosecondes depuis "un point de référence" (par exemple, le démarrage de la JVM), et ne serait donc pas sensible aux changements d'horloge du système.
Apache Commons-Lang dispose également de la classe StopWatch adaptée à vos besoins. Elle 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 comme standard pour les statistiques d'événements.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
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;
}