¿Cómo calculo el tiempo transcurrido de un evento en java? [duplicar]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo cronometro la ejecución de un método en Java? 37 respuestas
¿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?
Solución
Evitaría usar 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:
- ¿Cómo escribo un micro-benchmark correcto en Java?
- ¿Crear una referencia rápida / confiable con java?
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;
}