2012-08-10 19 views
5

estaba probando algunos algoritmos Wich i rodeado de un temporizador nanosegundos cuando se me olvidó al azar para eliminar el temporizador me enteré de que este código:¿Por qué System.nanoTime() tomar 4.400 segundos nano

a = System.nanoTime(); 
    System.out.println(System.nanoTime() - a); 

imprime siempre 4400 nano segundos en mi sistema. Eso sería 4.4 microsegundos, mientras que este código:

a = System.currentTimeMillis(); 
    for (int i = 0; i < 1000; i++) 
     System.nanoTime(); 
    System.out.println(System.currentTimeMillis() - a); 

imprime 0

+5

top asnwer debería explicar http://stackoverflow.com/questions/1770010/how-do-i-measure-time-elapsed-in-java –

+0

¿No es sobre la posible precisión? intente con otro procesador :) – tomasb

Respuesta

4

4400 nanosegundos es de 4,4 microsegundos, o 0,0044 milisegundos. El segundo ejemplo siempre imprimirá cero porque el tiempo transcurrido es mucho menos de un milisegundo. Luego están las diferencias entre los dos temporizadores utilizados: currentTimeMillis pueden ajustarse para la inclinación del reloj, mientras que nanoTime no, pero dudo que eso esté en juego aquí.

+0

Oh, Dios mío, soy tan estúpido ... Mistaken micros for millis ... De todos modos, actualicé el código, y todavía es un poco extraño. –

+1

La resolución del temporizador del sistema real no tiene que ser nanosegundos. En tu caso, podría ser 4.4 microsegundos (es decir, ese es el incremento más pequeño posible) –

0

El uso de nanoseconds() para medir a sí mismo probablemente no era un caso de uso que los implementadores consideraban. Típicamente, lo usaría para programar operaciones "lentas", o muchas llamadas a operaciones "rápidas" que juntas son "lentas", donde "lento" es algo más de 0.1 milisegundos.

La razón por la que desea cronometrar operaciones más largas es la granularidad de nanoseconds(), no es tan buena, depende del hardware y el sistema operativo, pero no cerca de un nanosegundo.

Cuestiones relacionadas