2009-08-07 27 views
6

Estoy sincronizando algunas cosas, que no puedo simplemente poner en un bucle largo. Y necesito cronometrarlos para ver cuánto tardan en completarse, pero parece que el temporizador tiene una precisión de 15-16 ms en java. ¿Cómo puedo evitar esto?Precisión del temporizador en java

Respuesta

8

¿Ha intentado utilizar System.nanoTime()?

Desde el Javadoc:

devuelve el valor actual del temporizador del sistema disponible más precisa, en nanosegundos.

Este método solo se puede usar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción del sistema o la hora del reloj de pared. El valor devuelto representa nanosegundos desde algún tiempo fijo pero arbitrario (tal vez en el futuro, por lo que los valores pueden ser negativos). Este método proporciona una precisión de nanosegundos, pero no necesariamente una precisión de nanosegundos. No se hacen garantías sobre la frecuencia con la que cambian los valores. Las diferencias en las llamadas sucesivas que abarcan más de aproximadamente 292 años (2 nanosegundos) no calcularán con precisión el tiempo transcurrido debido al desbordamiento numérico.

Por ejemplo, para medir el tiempo que toma algo de código para ejecutar:

largo horaInicio = System.nanoTime(); // ... el código que se está midiendo ... long estimatedTime = System.nanoTime() - startTime;

+6

je, me Me encanta esa frase: "Las diferencias en las llamadas sucesivas que abarcan más de aproximadamente 292 años (263 nanosegundos) no calcularán con precisión el tiempo transcurrido debido al desbordamiento numérico". Debería haber un concurso para el programa de software de mayor duración sin interrupción/mal funcionamiento. –

4

Clocks and Timers - General Overview

Java Programación de API para relojes y temporizadores La absoluta reloj "de tiempo de día" está representado por el método System.currentTimeMillis(), que devuelve un milisegundo representación de la hora del reloj de pared en milisegundos desde la época. Como tal, utiliza el reloj "time of day" del sistema operativo. La resolución de actualización de este reloj es a menudo la misma que la interrupción del temporizador (por ejemplo, 10ms), pero en algunos sistemas son fijos, independientemente de la tasa de interrupción.

El reloj de tiempo relativo se representa por el método System.nanoTime() que devuelve un tiempo "de funcionamiento libre" en nanosegundos. Esta vez solo es útil para comparar con otros valores de nanoTime . El método nanoTime utiliza el reloj de resolución más alta disponible en la plataforma y, aunque su valor de retorno es en nanosegundos, la resolución de actualización suele ser de solo microsegundos. Sin embargo, en algunos sistemas no hay más remedio que utilizar la misma fuente de reloj como para currentTimeMillis() - afortunadamente esto es rara y afecta sobre todo a los viejos sistemas Linux y Windows 98.

Cuestiones relacionadas