Ya no necesitas investigar más por todo internet porque has llegado al espacio perfecto, tenemos la solución que quieres hallar y sin complicarte.
Solución:
Desafortunadamente, ninguna de las diez respuestas publicadas hasta ahora es del todo correcta.
Si está midiendo el tiempo transcurrido y desea que sea correctodebes usar System.nanoTime()
. No puede utilizar System.currentTimeMillis()
a menos que no le importe que su resultado sea incorrecto.
El propósito de nanoTime
es para medir transcurrido tiempo y el propósito de currentTimeMillis
es para medir reloj de pared hora. No puedes usar uno para el otro propósito. La razón es que ningún reloj de computadora es perfecto; siempre se desvía y ocasionalmente necesita ser corregido. Esta corrección puede ocurrir manualmente o, en el caso de la mayoría de las máquinas, hay un proceso que se ejecuta y emite continuamente pequeñas correcciones al reloj del sistema (“reloj de pared”). Estos tienden a suceder a menudo. Otra corrección de este tipo ocurre cada vez que hay un segundo bisiesto.
Ya que nanoTime
El propósito de es medir el tiempo transcurrido, no se ve afectado por ninguna de estas pequeñas correcciones. Es lo que quieres usar. Cualquier sincronización actualmente en curso con currentTimeMillis
estará apagado, posiblemente incluso negativo.
Puede decir, “esto no parece que realmente importe tanto”, a lo que respondo, tal vez no, pero en general, ¿no es el código correcto mejor que el código incorrecto? Además, nanoTime
es más corto de escribir de todos modos.
Descargos de responsabilidad publicados anteriormente sobre nanoTime
por lo general, que solo tienen una precisión de microsegundos son válidos. Además, puede tomar más de un microsegundo entero para invocar, dependiendo de las circunstancias (al igual que el otro), así que no espere cronometrar intervalos muy, muy pequeños correctamente.
¿Qué tipos usar para lograr esto en Java?
La respuesta corta es una long
. Ahora, más sobre cómo medir…
Sistema.tiempoActualMillis()
La forma “tradicional” de hacer esto es, de hecho, usar System.currentTimeMillis()
:
long startTime = System.currentTimeMillis();
// ... do something ...
long estimatedTime = System.currentTimeMillis() - startTime;
oacltStopWatch
Tenga en cuenta que Commons Lang tiene una clase StopWatch que se puede usar para medir el tiempo de ejecución en milisegundos. Tiene métodos métodos como split()
, suspend()
, resume()
, etc que permitan tomar medidas en diferentes puntos de la ejecución y que usted pueda encontrar conveniente. Échale un vistazo.
Sistema.nanoTiempo()
Es posible que prefiera usar System.nanoTime()
si está buscando mediciones extremadamente precisas del tiempo transcurrido. De su javadoc:
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
jamón
Otra opción sería usar JAMon, una herramienta que recopila Estadísticas (tiempo de ejecución, número de aciertos, tiempo medio de ejecución, mínimo, máximo, etc.) para cualquier código que se encuentre entre los métodos start() y stop(). A continuación, un ejemplo muy simple:
import com.jamonapi.*;
...
Monitor mon=MonitorFactory.start("myFirstMonitor");
...Code Being Timed...
mon.stop();
Consulte este artículo en www.javaperformancetunning.com para obtener una buena introducción.
Usando AOP
Finalmente, si no desea saturar su código con estas medidas (o si no puede cambiar el código existente), entonces AOP sería un arma perfecta. No voy a discutir esto muy profundamente, pero al menos quería mencionarlo.
A continuación, un aspecto muy simple usando AspectJ y JAMon (aquí, el nombre abreviado del pointcut se usará para el monitor JAMon, de ahí la llamada a thisJoinPoint.toShortString()
):
public aspect MonitorAspect
pointcut monitor() : execution(* *.ClassToMonitor.methodToMonitor(..));
Object arround() : monitor()
Monitor monitor = MonitorFactory.start(thisJoinPoint.toShortString());
Object returnedObject = proceed();
monitor.stop();
return returnedObject;
La definición de pointcut podría adaptarse fácilmente para monitorear cualquier método basado en el nombre de la clase, el nombre del paquete, el nombre del método o cualquier combinación de estos. La medición es realmente un caso de uso perfecto para AOP.
Tu nueva clase:
public class TimeWatch
long starts;
public static TimeWatch start()
return new TimeWatch();
private TimeWatch()
reset();
public TimeWatch reset()
starts = System.currentTimeMillis();
return this;
public long time()
long ends = System.currentTimeMillis();
return ends - starts;
public long time(TimeUnit unit)
return unit.convert(time(), TimeUnit.MILLISECONDS);
Uso:
TimeWatch watch = TimeWatch.start();
// do something
long passedTimeInMs = watch.time();
long passedTimeInSeconds = watch.time(TimeUnit.SECONDS);
Posteriormente, el tiempo transcurrido se puede convertir al formato que desee, con un calendario, por ejemplo.
Greetz, GHad
Recuerda algo, que tienes la capacidad de valorar este post si te ayudó.