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?

51
demandé sur oers 2008-10-27 05:02:26

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.

78
répondu Leigh 2016-11-08 17:07:00

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.");
25
répondu jjnguy 2012-10-01 14:32:10

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

9
répondu Spencer Kormos 2008-10-27 03:58:13

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.

6
répondu Basil Bourque 2017-05-23 12:18:07

java.lang.System.currentTimeMillis() ou java.lang.System.nanoTime() doit servir à mesurer le temps écoulé.

5
répondu tvanfosson 2008-10-27 02:21:23

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;
}
3
répondu Wilhem Meignan 2012-11-20 16:48:16