2012-01-22 15 views
6

que tiene una interesante problema "viaje en el tiempo" en la actualidad, con el siguiente código:tiempo de seguimiento en Java: el uso de currentTimeMills()

for (int i = 0; i < 1; i++){ 
    long start = System.currentTimeMillis(); 
    // Some code here 
    System.out.print(i + "\t" + (System.currentTimeMillis() - start)); 
    start = System.currentTimeMillis(); 
    // Some code here 
    System.out.println("\t" + (System.currentTimeMillis() - start)); 
} 

y me dieron el resultado

0 15 -606 

Y parece que no es repetible Alguien tiene alguna pista sobre lo que sucedió dentro durante el tiempo de ejecución? Simplemente curioso ...

Nueva edición: He utilizado una pequeña prueba para confirmar las respuestas a continuación. Puedo ejecutar el programa y cambiar el tiempo del sistema durante la carrera, y finalmente repetir el "viaje en el tiempo":

0 -3563323 163 

Caso cerrado. ¡Gracias chicos!

Más palabras: tanto currentTimeMillis() como nanoTime() se basan en el temporizador del sistema, por lo que no serán monótonas si el temporizador del sistema se actualiza (se regresa, específicamente). Es mejor utilizar un temporizador basado en Internet para tales casos.

+0

No estoy seguro 'currentTimeMillis' es monotónico. Puede tener mejores resultados con 'System.nanoTime()' que está diseñado especialmente para medir intervalos. – Rom1

+0

@ asksw0rder: ¿puede ejecutar el mismo programa nuevamente y actualizar qué segundo resultado es? –

+0

@ asksw0rder ¿Cuál es la variable i? ¿cuál es su valor? No tiene sentido obtener 0 en la primera salida. – sfrj

Respuesta

11

System.currentTimeMillis() depende de la hora del sistema. Por lo tanto, podría ser modificado por sistemas de terceros.

Para medir el tiempo es System.nanoTime() la mejor opción.

+0

+1 por mencionar mejor alternativa – sfrj

+0

nanoTime() es no está bien para ese caso tampoco. Es mejor utilizar el tiempo basado en Internet. – asksw0rder

+0

No dije que fuera la mejor opción, solo una mejor que 'System.currentTimeMillis()'! .. es complicado medir nano segundos a través de Internet. – Robin

0

Recuerdo algo así como los ajustes de tiempo realizados en la hora del sistema de vez en cuando coinciden con el tiempo real. Y dado que currentTimeMillis depende del reloj del sistema que podría haber sucedido. También estás sincronizando con un servidor de tiempo, eso también podría ser.

Cuestiones relacionadas