taking see method lapse java timing

java - see - ¿Qué tan preciso es Thread.sleep?



take time method java (3)

De la especificación del lenguaje Java.

Thread.sleep hace que el subproceso que se está ejecutando en ese momento esté en suspensión (cese temporalmente la ejecución) durante el tiempo especificado, sujeto a la precisión y la precisión de los cronómetros y programadores del sistema. El subproceso no pierde la propiedad de ningún monitor y la reanudación de la ejecución dependerá de la programación y la disponibilidad de los procesadores en los que se ejecute el subproceso.

Estoy estudiando hardware de computadora donde aprendemos que usar un temporizador de hardware obtiene resultados más precisos que un retraso de software. Escribí una demora de software en el ensamblaje durante 1 milisegundo y puedo iniciar un proceso que repite cada milisegundo con este retraso y con un contador hacer otra cosa cada 100 milisegundos, y esta técnica sería menos precisa que usar un temporizador de hardware Se incorporó con mi hardware que voy a usar ahora.

Así que me pregunto qué tan preciso es el tiempo que está integrado con Java? Tenemos System.currentTimeMillis y Thread.sleep y es posible que estos no utilicen temporizadores de hardware. ¿Qué tan exactos son estos métodos Java integrados en comparación con un temporizador de hardware?


No encontré Thread.sleep para ser precisa. De hecho, encontré que parece dormir menos de lo que promete.

Resultados cuando se configura para dormir 1 milisegundo:

********* Average elapsed time = 957 micro seconds

A continuación se muestra mi prueba:

public static void main(String[] args) throws InterruptedException { List<Long> list = new ArrayList<Long>(); int i= 0; while(i <=100){ long authStartTime = System.nanoTime(); Thread.sleep(1); long elapsedTime = System.nanoTime() - authStartTime; System.out.println("*****"+elapsedTime/1000+ " mics"); list.add(elapsedTime); i++; } long sum=0; for(long l : list){ sum = sum + l; } System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds"); System.exit(0); }


Thread.sleep() es inexacto. La inexactitud depende del sistema operativo subyacente y sus temporizadores y programadores. He experimentado que la recolección de basura en paralelo puede llevar a un sueño excesivo.

Cuando realice simulaciones en "tiempo real", tendrá que corregir su bucle principal para detectar las imprecisiones del sleep . Esto se puede hacer calculando el tiempo esperado de activación y comparándolo con la hora real de activación y corrigiendo la diferencia en el siguiente ciclo.

Si necesita un mejor rendimiento, eche un vistazo a las especificaciones del sistema Java Real-Time System . No lo he usado yo mismo, así que no puedo proporcionar más detalles.