tiempo simular reloj hilos ejecutar cronometro contador consola con codigo cierto ciclos cada java benchmarking

java - simular - ¿Es aceptable la evaluación comparativa del cronómetro?



simular un reloj en java (13)

¿Cómo aborda la programación del sistema operativo cuando se realiza una evaluación comparativa?

Punto de referencia durante el tiempo suficiente en un sistema que sea representativo de la máquina que va a utilizar. Si su sistema operativo ralentiza su aplicación, entonces eso debería ser parte del resultado.

No tiene sentido decir que mi programa sería más rápido si no tuviera un sistema operativo.

Si está utilizando Linux , puede usar herramientas como numactl , chrt y taskset para controlar cómo se usan las CPU y la programación.

¿Alguna vez alguien utiliza la evaluación comparativa del cronómetro, o debe usar siempre una herramienta de rendimiento? ¿Hay alguna buena herramienta gratuita disponible para Java? ¿Qué herramientas usas?

Para aclarar mis preocupaciones, la evaluación comparativa del cronómetro está sujeta a error debido a la programación del sistema operativo. En una ejecución determinada de su programa, el sistema operativo puede programar otro proceso (o varios) en el medio de la función que está cronometrando. En Java, las cosas son incluso un poco peores si estás tratando de sincronizar una aplicación con subprocesos, ya que el programador de JVM arroja incluso un poco más de aleatoriedad en la mezcla.

¿Cómo aborda la programación del sistema operativo cuando se realiza una evaluación comparativa?


¡Cronómetro es en realidad el mejor punto de referencia!

El tiempo real de respuesta del usuario final es el tiempo que realmente importa.

No siempre es posible obtener este tiempo utilizando las herramientas disponibles, por ejemplo, la mayoría de las herramientas de prueba no incluyen el tiempo que tarda un buscador en representar una página, por lo que una página sobrecompleta con un CSS mal escrito mostrará segundos segundos de respuesta a las pruebas herramientas, pero, 5 segundos más tiempo de respuesta para el usuario.

Las herramientas son excelentes para realizar pruebas automatizadas y para determinar el problema, pero no pierda de vista lo que realmente desea medir.


Creo que una pregunta clave es la complejidad y el tiempo de la operación.

A veces incluso uso mediciones físicas de cronómetros para ver si algo lleva minutos, horas, días o incluso semanas en computar (estoy trabajando con una aplicación donde los tiempos de ejecución en los pedidos de varios días no son desconocidos, incluso si los segundos y los minutos son los tiempos más comunes).

Sin embargo, la automatización que ofrecen las llamadas a cualquier tipo de sistema de reloj en la computadora, como la llamada de Java Millis a la que se hace referencia en el artículo vinculado, es claramente superior a ver manualmente cuánto tiempo se ejecuta algo.

Los perfiladores son agradables cuando funcionan, pero he tenido problemas para aplicarlos a nuestra aplicación, que generalmente implica la generación dinámica de código, la carga dinámica de archivos DLL y el trabajo realizado en los dos lenguajes de programación compilados justo a tiempo compilados de mi aplicación. Con frecuencia se limitan a asumir un único idioma fuente y otras expectativas poco realistas para software complejo.


Debe probar una cantidad realista de iteraciones, ya que obtendrá diferentes respuestas dependiendo de cómo pruebe el tiempo. Si solo realiza una operación una vez, podría ser engañoso tomar el promedio de muchas iteraciones. Si desea saber el tiempo que lleva una vez que la JVM se ha calentado, puede ejecutar muchas (por ejemplo, 10.000) iteraciones que no están incluidas en los tiempos.

También sugiero que use System.nanoTime () ya que es mucho más preciso. Si su tiempo de prueba es de alrededor de 10 microsegundos o menos, no desea llamar a esto con demasiada frecuencia o puede cambiar su resultado. (Por ejemplo, si estoy probando durante 5 segundos y quiero saber cuándo termina, solo obtengo el nanoTime cada 1000 iteraciones, si sé que una iteración es muy rápida)


Después de todo, es probablemente la segunda forma más común de evaluación comparativa, justo después del "benchmarking sin observación", donde decimos "esta actividad parece lenta, parece rápida".

Por lo general, lo más importante para optimizar es lo que interfiera con la experiencia del usuario, que a menudo es una función de la frecuencia con la que realiza la acción y de cualquier otra cosa que ocurra al mismo tiempo. Otras formas de evaluación comparativa a menudo solo ayudan a concentrarse en esto.


Ejecuté un programa hoy que buscó y recopiló información de un grupo de archivos dBase, tardó poco más de una hora en ejecutarse. Eché un vistazo al código, hice una conjetura sobre cuál era el cuello de botella, realicé una pequeña mejora en el algoritmo y reordené el programa, esta vez se completó en 2.5 minutos. No necesitaba ninguna herramienta de creación de perfiles o suites de referencia para decirme que la nueva versión era una mejora significativa. Si tuviera que optimizar aún más el tiempo de ejecución, probablemente habría hecho un análisis más sofisticado, pero esto no era necesario. Encuentro que este tipo de "benchmarking de cronómetro" es una solución aceptable en una gran cantidad de casos y recurrir a herramientas más avanzadas realmente requeriría más tiempo en estos casos.


Es totalmente válido siempre que mida intervalos de tiempo lo suficientemente grandes. Ejecutaría 20-30 ejecuciones de lo que pretende probar para que el tiempo transcurrido total sea superior a 1 segundo. Me di cuenta de que los cálculos de tiempo basados ​​en System.currentTimeMillis () tienden a ser 0ms o ~ 30ms; No creo que puedas obtener algo más preciso que eso. Es posible que desee probar System.nanoTime () si realmente necesita medir un pequeño intervalo de tiempo:


La evaluación comparativa del cronómetro está bien, siempre que se midan suficientes iteraciones como para ser significativas. Normalmente, requiero un tiempo total transcurrido de algunos segundos de un solo dígito. De lo contrario, sus resultados se desvían considerablemente de forma significativa por la programación y otras interrupciones de O / S en su proceso.

Para esto utilizo un pequeño conjunto de métodos estáticos que construí hace mucho tiempo, que se basan en System.currentTimeMillis() .

Para el trabajo de creación de perfiles he usado jProfiler durante varios años y lo he encontrado muy bien. Recientemente YourKit , que parece genial desde el sitio web, pero no lo he usado en absoluto, personalmente.

Para responder a la pregunta sobre la programación de interrupciones, encuentro que realizar ejecuciones repetidas hasta lograr consistencia / observar funciona en la práctica para descartar los resultados anómalos de la programación del proceso. También encuentro que la programación de hilos no tiene impacto práctico para carreras de entre 5 y 30 segundos. Por último, después de pasar los pocos segundos, la programación del umbral tiene, en mi experiencia, un impacto insignificante en los resultados. Encuentro que una ejecución de 5 segundos consistentemente promedia lo mismo que una ejecución de 5 minutos para tiempo / iteración.

También puede considerar prearmar el código probado aproximadamente 10,000 veces para "calentar" el JIT, dependiendo de la cantidad de veces que espera que el código probado se ejecute a lo largo del tiempo en la vida real.


Lo hago todo el tiempo. Prefiero usar un generador de perfiles, pero el proveedor del idioma específico del dominio con el que estoy trabajando no proporciona uno.


Los perfiladores pueden obstaculizar los tiempos, así que usaría una combinación de cronometraje del cronómetro para identificar problemas generales de rendimiento, luego usaré el generador de perfiles para determinar dónde se está gastando el tiempo. Repita según sea necesario.


No creo que la evaluación comparativa del cronómetro sea demasiado horrible, pero si puede acceder a una máquina Solaris u OS X, debe verificar DTrace. Lo he usado para obtener información excelente sobre el tiempo en mis aplicaciones.


Siempre uso la evaluación comparativa del cronómetro, ya que es mucho más fácil. Sin embargo, los resultados no necesitan ser muy precisos. Si necesita resultados precisos, entonces no debe usar la evaluación comparativa del cronómetro.


Un generador de perfiles le brinda información más detallada, que puede ayudar a diagnosticar y solucionar problemas de perfusión.

En términos de medición real, el tiempo de cronómetro es lo que notan los usuarios, por lo que si desea validar que las cosas están dentro de los límites aceptables, el tiempo de cronómetro es bueno.

Sin embargo, cuando quiera solucionar problemas, un generador de perfiles puede ser de gran ayuda.