2010-01-17 6 views
7

Estoy trabajando en un simple text markup Java Library que debe ser, entre otros requisitos, rápido.Perfiles de Java: ¿Qué tan confiables son los valores que otorga?

Para tal fin, hice algunos perfiles, pero los resultados me dan peores números que luego se miden cuando se ejecuta en modo sin perfil.

Así que mi pregunta es - ¿Qué tan confiable es el perfil? ¿Eso da solo una relación informativa del tiempo pasado en métodos? ¿Tiene esto en cuenta el compilador JIT o solo se interpreta el modo de creación de perfiles? Yo uso NetBeans Profiler y Sun JDK 1.6.

Gracias.

Respuesta

5

Al ejecutar perfiles, siempre incurrirá en una penalización de rendimiento ya que algo tiene que medir el tiempo de inicio/finalización de los métodos, hacer un seguimiento de los objetos del montón (para perfilado de memoria), por lo que hay una sobrecarga de administración .

Sin embargo, le dará consejos claros para averiguar dónde están los cuellos de botella. Tiendo a buscar los métodos donde se gasta el tiempo más acumulado y verifico si se pueden hacer optimizaciones. También es útil determinar si los métodos se llaman innecesariamente.

Con métodos que son muy pequeños, tome los resultados de perfil con una pizca de sal, a veces el proceso de medición puede tomar más tiempo que el método llamar y sesgar los resultados (podría parecer que un pequeño, a menudo llamado método tiene más de un impacto en el rendimiento).

Espero que ayude.

2

Debido a la instrumentación, el código de perfil en promedio se ejecutará más lento que el código no perfilado. Sin embargo, la velocidad de medición no es el propósito de los perfiles.

La salida de creación de perfiles le indicará cuellos de botella, lugares donde los hilos pasan más tiempo, códigos que se comportan peor de lo esperado o posibles pérdidas de memoria.

Puede utilizar esas sugerencias para mejorar dichos métodos y el perfil nuevamente hasta que esté satisfecho con los resultados.

Un generador de perfiles no será una solución para un estilo de codificación que sea x% más lento que lo óptimo, sin embargo, todavía necesita perder tiempo ajustando aquellas partes de su código que se utilizan con más frecuencia que otras.

2

No me sorprende el hecho de que se obtienen los peores resultados cuando el perfilado de su aplicación como instrumento de código java generalmente siempre ralentizará su ejecución. Esto es en realidad muy bien capturado por la página de Wikipedia sobre Profiling que menciona que la instrumentación lata causa cambios en el rendimiento de un programa, que puede causar resultados inexactos inexactas y heisenbugs (debido a the observer effect: observadores afectan lo que están observando, por el mero acto de observarlo solo).

Dicho esto, si quiere medir la velocidad, creo que no está utilizando la herramienta adecuada. Los perfiladores se utilizan para encontrar cuellos de botella en una aplicación (y para eso, realmente no le importa el impacto general). Pero si desea comparar su biblioteca, debe usar una herramienta de prueba de rendimiento (por ejemplo, algo así como JMeter) que le pueda dar un tiempo promedio de ejecución por llamada. Obtendrá resultados mucho mejores y más confiables con la herramienta adecuada.

2

El perfil no debería tener ninguna influencia en el compilador JIT. Sin embargo, el código insertado para perfilar su aplicación ralentizará bastante los métodos.
Los Profillers trabajan en diferentes modelos, insertan código para ver cuánto tiempo y con qué frecuencia se están ejecutando los métodos o solo toman muestras al sondear repetidamente el código que se está ejecutando actualmente.
La primera ralentizará bastante su código, mientras que la segunda no es 100% precisa, ya que puede perder algunas llamadas a métodos.

1

El código de perfil es más lento, como se mencionó en la mayoría de los comentarios anteriores. Yo diría que use el perfil para medir solo el rendimiento relativo de varias partes de su código (digamos métodos). No utilice las medidas de un generador de perfiles como indicador del rendimiento general del código (a menos que desee una medida del peor caso, en cuyo caso lo que tiene sería un valor sobreestimado)

1

He encontrado que obtengo resultado diferente según el generador de perfiles que uso Sin embargo, los resultados a menudo son válidos, pero tienen una perspectiva diferente del problema. Algo que a menudo hago cuando perfilo el uso de la CPU es habilitar el perfil de asignación de memoria. Esto a menudo me da diferentes resultados de CPU (debido a la sobrecarga aumentada causada por el perfil de memoria) y puede darme algunos lugares útiles para optimizar.

Cuestiones relacionadas