Pregunta

¿Alguna vez alguien utiliza la evaluación comparativa de cronómetro, o debería usarse siempre una herramienta de rendimiento? ¿Hay alguna buena herramienta gratuita disponible para Java? ¿Qué herramientas utilizas?

Para aclarar mis inquietudes, la evaluación comparativa del cronómetro está sujeta a errores 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 medio de la función que está programando. En Java, las cosas son incluso un poco peores si intentas cronometrar una aplicación de subprocesos, ya que el programador JVM arroja un poco más de aleatoriedad en la mezcla.

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

¿Fue útil?

Solución

La evaluación comparativa del cronómetro está bien, siempre que mida lo suficiente para ser significativo. Normalmente, requiero un tiempo total transcurrido de un número de segundos de un solo dígito. De lo contrario, sus resultados se desvían fácilmente de forma significativa por la programación y otras interrupciones de O / S en su proceso.

Para esto uso 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 para un número De años y lo he encontrado muy bien. Recientemente he revisado YourKit , lo que parece excelente en el sitio web, pero no lo he usado en absoluto , personalmente.

Para responder a la pregunta sobre las interrupciones de la programación, me parece que hacer ejecuciones repetidas hasta que se logre la consistencia / se observen los trabajos en la práctica para eliminar resultados anómalos de la programación del proceso. También encuentro que la programación de hilos no tiene un impacto práctico para ejecuciones de entre 5 y 30 segundos. Por último, después de que pase los pocos segundos, la programación de umbrales tiene, en mi experiencia, un impacto insignificante en los resultados: encuentro que una ejecución de 5 segundos promedia constantemente lo mismo que una ejecución de 5 minutos por tiempo / iteración.

Es posible que también desee considerar la ejecución previa del código probado unas 10.000 veces para " calentar " el JIT, dependiendo de la cantidad de veces que espere que el código probado se ejecute a lo largo del tiempo en la vida real.

Otros consejos

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

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

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

Sin embargo, cuando quiera realmente solucionar problemas, un generador de perfiles puede ser realmente útil.

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

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

No siempre es posible obtener este tiempo usando las herramientas disponibles, por ejemplo, la mayoría de las herramientas de prueba no incluyen el tiempo que tarda un navegador en renderizar una página, por lo que una página demasiado compleja con css mal escrito mostrará tiempos de respuesta por segundo. a las herramientas de prueba, pero, 5 segundos más tiempo de respuesta al usuario.

Las herramientas son excelentes para las pruebas automatizadas y para la determinación de problemas, pero no pierdas de vista lo que realmente quieres medir.

Necesitas probar un número realista de iteraciones, ya que obtendrás diferentes respuestas dependiendo de cómo pruebes 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 tarda una vez que la JVM se ha calentado, puede ejecutar muchas (por ejemplo, 10.000) iteraciones que no están incluidas en los horarios.

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

  

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

Punto de referencia para tiempo suficiente en un sistema que sea representativo de la máquina que utilizará. Si su sistema operativo ralentiza su aplicación, 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á usando Linux , puede usar herramientas como numactl , chrt y taskset para controlar cómo se utilizan las CPU y la programación.

Los perfiladores pueden interferir con los tiempos, por lo que usaría una combinación de cronómetro para identificar los problemas de rendimiento general, y luego utilizaría el generador de perfiles para averiguar dónde se está gastando el tiempo. Repita el proceso según sea necesario.

Después de todo, es probablemente la segunda forma más popular de evaluación comparativa, justo después de " evaluación comparativa sin vigilancia " - donde decimos "esta actividad parece lenta, esa parece rápida",

Por lo general, lo que es más importante optimizar es lo que interfiere con la experiencia del usuario, que generalmente es una función de la frecuencia con la que se realiza la acción y todo lo que sucede al mismo tiempo. Otras formas de evaluación comparativa a menudo solo ayudan a concentrarse en ellas.

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

A veces, incluso uso mediciones físicas de cronómetro para ver si algo demora minutos, horas, días o incluso semanas en calcular (estoy trabajando con una aplicación en la que los tiempos de ejecución de varios días no son desconocidos, incluso si son segundos). y los minutos son los intervalos de tiempo más comunes).

Sin embargo, la automatización proporcionada por las llamadas a cualquier tipo de sistema de reloj en la computadora, como la llamada java millis a la que se hace referencia en el artículo vinculado, es claramente superior a la visualización manual de la duración de algo.

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

Hoy ejecuté un programa que buscó y recopiló información de un grupo de archivos de dBase, que tomó una hora para ejecutarse. Eché un vistazo al código, hice una estimación acertada sobre el cuello de botella, realicé una pequeña mejora en el algoritmo y volví a ejecutar el programa, esta vez se completó en 2.5 minutos .

No necesitaba ninguna herramienta de perfil ni 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 fue necesario. Me parece que este tipo de " cronómetro de cronómetro " es una solución aceptable en muchos casos y, en estos casos, recurrir a herramientas más avanzadas realmente requeriría más tiempo.

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top