Question

    

Cette question a déjà une réponse ici:

         

Qu'est-ce qu'un moyen simple et facile d'accéder à l'horloge système à l'aide de Java, afin de pouvoir calculer le temps écoulé d'un événement?

Était-ce utile?

La solution

J'éviterais d'utiliser System.currentTimeMillis () pour mesurer le temps écoulé. currentTimeMillis () renvoie l'heure «de l'horloge murale», qui peut changer (par exemple: heure avancée, changement d'utilisateur de l'administrateur) et fausser les mesures d'intervalle.

System.nanoTime () , en revanche, renvoie le nombre de nanosecondes écoulées depuis "un point de référence" (par exemple, le démarrage de la machine virtuelle Java), et ne serait donc pas soumis aux modifications de l'horloge système.

Autres conseils

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 propose également la classe StopWatch adaptée à vos besoins. Il utilise System.currentTimeMillis (), vous aurez donc toujours des problèmes de résolution, mais vous pouvez faire une pause et faire des temps intermédiaires et autres. Je l'utilise maintenant en standard pour les statistiques d'événement.

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 les versions ultérieures incluent le framework java.time.

Un Instant correspond à un moment de la chronologie en UTC, avec une résolution en nanosecondes (jusqu'à 9 chiffres d'une fraction décimale de seconde). maintenant La méthode saisit le moment actuel de la date et de l'heure.

Instant now = Instant.now();
  

2016-03-12T04: 29: 39.123Z

Vous pouvez calculer le temps écoulé entre une paire d'objets Instant sous la forme d'un Durée . La durée utilise une résolution en nanosecondes avec une valeur maximale des secondes pouvant être conservées longtemps. C'est plus que l'âge actuel estimé de l'univers.

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

La sortie par défaut de < code> Durée :: toString est dans la norme ISO 8601 format. Vous pouvez également demander un nombre total de nanosecondes ( àNanos ) ou en millisecondes ( toMillis ), ainsi que d'autres montants.

Java 8

Sous Java 8, l'extraction du moment actuel ne résout que la résolution en millisecondes (jusqu'à 3 chiffres d'une fraction décimale de seconde). Ainsi, bien que les classes java.time puissent stocker des nanosecondes, elles ne peuvent déterminer le moment actuel qu’en millisecondes. Cette limitation est due à un problème hérité (valeur par défaut de < code> Clock , l’implémentation utilise System.currentTimeMillis () ).

Java 9

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

Consultez cette page du problème OpenJDK pour plus d'informations: Augmentez la précision de la mise en oeuvre de java .time.Clock.systemUTC ()

Micro-référence

Si votre objectif est l'analyse comparative, veillez à examiner d'autres questions telles que:

Des cadres sont disponibles pour faciliter l'analyse comparative de courte durée.

java.lang.System.currentTimeMillis () ou java.lang.System.nanoTime () devrait 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top