Desafortunadamente, no creo que Java RTS sea lo suficientemente maduro en este momento.
El tiempo de Java intenta proporcionar el mejor valor (en realidad, delegan el código nativo para llamar para obtener la hora de kernal). Sin embargo, las especificaciones de JVM hacen que este descargo de responsabilidad general de medición de tiempo se use principalmente para cosas como las actividades de GC y soporte del sistema subyacente.
- Ciertas actividades de GC bloquearán todos los hilos, incluso si está ejecutando simultáneamente GC.
- la precisión predeterminada de la marca del reloj de Linux es de solo 10ms. Java no puede mejorarlo si linux kernal no es compatible.
No he descubierto cómo abordar el # 1 a menos que tu aplicación no necesite hacer GC. Una aplicación decente y de tamaño mediano probablemente y ocasionalmente se gaste como decenas de milisegundos en las pausas de GC. Probablemente no tenga suerte si su requisito de precisión es inferior a 10 ms.
En cuanto al n. ° 2, puede tune the linux kernal para dar más precisión. Sin embargo, también obtiene menos de su caja porque ahora el contexto kernal cambia más a menudo.
Tal vez, deberíamos verlo en un ángulo diferente. ¿Hay alguna razón por la cual OPS necesita una precisión de 10 ms por debajo? ¿Está bien decirle a Ops que la precisión es de 10ms Y también mirar el registro del GC en ese momento, para que sepan que el tiempo es + -10ms preciso sin actividad de GC en ese momento?
¿En qué sistema operativo demostraste que System.nanoTime() producía una salida que estaba desactivada por "muchos microsegundos"? –
Estaba en un sistema Linux en una máquina de doble núcleo, pero era una instalación bastante antigua (desde principios de 2007 ...). Tal vez esa fue la causa. Volveré a revisar algo más reciente. También por lo que recuerdo, tuve llamadas sucesivas que devolvían el mismo valor y saltaban unos pocos microrsegundos. – penpen