2009-12-14 10 views
6

Basado en las ideas presentadas en link implementé varios "métodos de suspensión" diferentes. Uno de estos métodos fue el "sueño binaria", que se ve así:¿El método System.currentTimeMillis() realmente devuelve la hora actual?

while (System.currentTimeMillis() < nextTimeStamp) 
{ 
sleepTime -= (sleepTime/2); 
sleep(sleepTime); 
} 

Debido a que la verificación si ya se alcanza el siguiente paso de tiempo se lleva a cabo a principios I, se esperaría que el método está funcionando demasiado larga . Pero la distribución cumulativa del error de simulación (tiempo esperado - tiempo real) se ve así: alt text http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg

¿Alguien tiene una idea de por qué estoy obteniendo estos resultados? Tal vez el método System.currentTimeMillis() realmente no devuelve la hora actual?

BR,

Markus

@irreputable

Cuando hice la evaluación también creé una curva de campana utilizando un programa de estadística alemán. Debido a que no era posible cambiar el subtítulo, aquí está la traducción en Inglés de todos los elementos relevantes:

Häufigkeit = frecuencia

¡Error = Error de

Mittelwert = Media

Std-Abw = desviación estándar

alt text http://img694.imageshack.us/img694/2254/bellcurve.jpg

+1

Intenté hacer una pregunta en http://stackoverflow.com/questions/ask y copié el tema de su tema en mi nueva pregunta de prueba y mientras ingresaba el campo de mensaje, obtuve una lista de todas (muy) relevantes temas que ya responden a su pregunta. Me preguntaba si realmente lo habías notado y explorado. – BalusC

+0

Ohhh, tienes razón. Tal vez debería consultar más a menudo los temas relacionados antes de escribir una pregunta :-) – Markus

+0

+1 para la curva. sabíamos que no es preciso, pero es agradable ver alguna cuantificación. ¿Puedes convertirlo en una curva de campana? – irreputable

Respuesta

10

no, no lo hace. Su joven hermano System#nanoTime() tiene una precisión mucho mejor que System#currentTimeMillis().

Además de las respuestas en sus Javadocs (haga clic en los enlaces de arriba), este tema fue discutido aquí varias veces también. Haga una búsqueda en "currenttimemillis vs nanotime" y obtendrá debajo de cada este tema: System.currentTimeMillis vs System.nanoTime.

+2

nanoTime() tiene mejor precisión, pero su precisión sigue siendo la misma que la de CurrentMillis() (depende del sistema operativo subyacente). Ver http://en.wikipedia.org/wiki/Accuracy_and_precision –

+0

Gracias por el aviso (el inglés no es mi nativo). Lo he arreglado – BalusC

+1

Sin embargo ... Su inglés tampoco es tan bueno. Debería ser "su" (de él) y no "es" (lo es): o) – BalusC

2

por la documentación,

* Returns the current time in milliseconds. Note that 
* while the unit of time of the return value is a millisecond, 
* the granularity of the value depends on the underlying 
* operating system and may be larger. For example, many 
* operating systems measure time in units of tens of 
* milliseconds. 
2

Lo que está viendo es el reloj que subyace a la resolución de 15 ms resolución. Esta es una característica de la tasa de interrupción OS &. Hay un parche para el kernel de Linux para aumentar esta resolución a 1 ms, no estoy seguro acerca de las ventanas. Ha habido un número de posts sobre esto ya.