Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Cuál es una forma simple / fácil de acceder al reloj del sistema utilizando Java, para que pueda calcular el tiempo transcurrido de un evento?

¿Fue útil?

Solución

Evitaría usar System.currentTimeMillis () para medir el tiempo transcurrido. currentTimeMillis () devuelve la hora del 'reloj de pared', que puede cambiar (p. ej., horario de verano, usuario administrador que cambia el reloj) y sesgar sus mediciones de intervalo.

System.nanoTime () , por otro lado, devuelve el número de nanosegundos desde 'algún punto de referencia' (por ejemplo, inicio de JVM) y, por lo tanto, no sería susceptible de cambios en el reloj del sistema.

Otros consejos

Este es un código de ejemplo.

long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");

Apache Commons-Lang también tiene la clase StopWatch adecuada para su propósito. Utiliza System.currentTimeMillis (), por lo que aún tendrá problemas de resolución, pero puede pausar y hacer tiempos de vuelta y demás. Lo uso como estándar ahora para las estadísticas de eventos.

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

La Answer by Leigh es correcta.

java.time

Java 8 y versiones posteriores tienen el marco java.time incorporado.

Un Instant es un momento en la línea de tiempo en UTC con resolución de nanosegundos (hasta 9 dígitos de una fracción decimal de segundo). El ahora el método toma el momento actual de fecha y hora.

Instant now = Instant.now();
  

2016-03-12T04: 29: 39.123Z

Puede calcular el tiempo transcurrido entre un par de objetos Instant como Duration . La duración utiliza una resolución de nanosegundos con un valor máximo de los segundos que se pueden mantener en un largo. Esto es mayor que la edad estimada actual del universo.

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

La salida predeterminada de < code> Duration :: toString está en el estándar ISO 8601 formato. También puede solicitar un recuento total de nanosegundos ( toNanos ) o milisegundos ( toMillis ), así como otras cantidades.

Java 8

En Java 8, recuperar el momento actual solo se resuelve en una resolución de milisegundos (hasta 3 dígitos de una fracción decimal de segundo). Entonces, mientras que las clases de java.time pueden almacenar nanosegundos, solo pueden determinar el momento actual con milisegundos. Esta limitación se debe a un problema heredado (el valor predeterminado es < La implementación de code> Clock utiliza System.currentTimeMillis () ).

Java 9

En Java 9 y versiones posteriores, la implementación predeterminada de Clock puede determinar el momento actual en una resolución de hasta nanosegundos. En realidad, hacerlo depende de la precisión del hardware del reloj de su computadora.

Consulte esta página de OpenJDK para obtener más información: Aumente la precisión de la implementación de java .time.Clock.systemUTC ()

Micro Benchmark

Si su propósito es realizar una evaluación comparativa, asegúrese de consultar otras preguntas como:

Los marcos están disponibles para ayudar con la evaluación comparativa de corta duración.

java.lang.System.currentTimeMillis () o java.lang.System.nanoTime () debería funcionar para medir el tiempo transcurrido.

Aquí hay una pequeña clase de StopWatch que escribí usando System.nanoTime () como se sugiere en la respuesta 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top