tipos son los cuáles java performance profiler

java - son - Si Profiler no es la respuesta, ¿qué otras opciones tenemos?



layout java netbeans (5)

Después de ver la presentación "Ansiedad de rendimiento" de Joshua Bloch, leí el documento que sugirió en la presentación "Evaluación de la precisión de los per fi les de Java" . Citando la conclusión:

Nuestros resultados son inquietantes porque indican que la incorrección del per fi l es omnipresente en la mayoría de nuestros siete puntos de referencia y en dos JVM de producción, y signi fi cativo, los cuatro perfiles de vanguardia producen per fi les incorrectos. Los perfiles incorrectos pueden hacer que un analista de rendimiento pierda el tiempo optimizando los métodos fríos que tendrán un efecto mínimo en el rendimiento. Mostramos que un perito de prueba de concepto que no utiliza puntos de rendimiento para el muestreo no sufre de los problemas anteriores

La conclusión del documento es que no podemos creer realmente el resultado de los perfiladores. Pero entonces, ¿cuál es la alternativa de usar profilers? ¿Deberíamos regresar y usar nuestra sensación para hacer la optimización?

ACTUALIZACIÓN : Un punto que parece omitirse en la discusión es el efecto observador . ¿Podemos construir un generador de perfiles que realmente '' efecto de observador '' - libre?


A menos que esté construyendo aplicaciones de última generación que necesitan cada ciclo de CPU, entonces descubrí que los perfiladores son una buena forma de encontrar el 10% de las partes más lentas de su código. Como desarrollador, yo diría que debería ser todo lo que realmente importa en casi todos los casos.

Tengo experiencia con http://www.dynatrace.com/en/ y puedo decir que es muy bueno para encontrar la fruta que cuelga más abajo.

Los perfiladores son como cualquier otra herramienta y tienen sus peculiaridades, pero yo confiaría en ellos sobre cualquier ser humano para encontrar los puntos calientes de su aplicación.


En realidad, es mejor perfilar a nivel de base de datos. La mayoría de las bases de datos empresariales vienen con la capacidad de mostrar las consultas principales durante un período de tiempo. Comience a trabajar en esas consultas hasta que las primeras hayan bajado a 300 ms o menos, y habrá progresado mucho. Los perfiladores son útiles para mostrar el comportamiento del montón y para identificar los hilos bloqueados, pero personalmente nunca he conseguido mucha tracción con los equipos de desarrollo en la identificación de métodos calientes u objetos grandes.


Oh, hombre, ¿por dónde empezar?

Primero, estoy sorprendido de que esto sea noticia. En segundo lugar, el problema no es que los perfiladores sean malos, es que algunos perfiladores son malos. Los autores construyeron uno que, creen, es bueno, simplemente evitando algunos de los errores que encontraron en los que evaluaron. Los errores son comunes debido a algunos mitos persistentes sobre el perfil de rendimiento .

Pero seamos positivos. Si uno quiere encontrar oportunidades para la aceleración, es realmente muy simple:

  • El muestreo no debe estar correlacionado con el estado del programa.
    Eso significa que ocurre en un momento verdaderamente aleatorio, independientemente de si el programa está en E / S (excepto para la entrada del usuario), o en GC, o en un circuito cerrado de CPU, o lo que sea.

  • El muestreo debe leer la pila de llamadas a la función ,
    para determinar qué declaraciones estaban "activas" en el momento de la muestra. La razón es que cada sitio de llamada (punto en el que se llama a una función) tiene un costo porcentual igual a la fracción de tiempo que está en la pila. (Nota: el documento se refiere exclusivamente al tiempo de uso propio, sin tener en cuenta el impacto masivo de las llamadas a funciones evitables en el software de gran tamaño. De hecho, la razón detrás del gprof original era ayudar a encontrar esas llamadas).

  • Los informes deben mostrar el porcentaje por línea (no por función).
    Si se identifica una función "caliente", todavía hay que buscar dentro de ella las líneas "calientes" de la contabilidad del código para el tiempo. ¡Esa información está en las muestras ! ¿Por qué ocultarlo?

Un error casi universal (que comparte el periódico) es preocuparse demasiado por la precisión de la medición , y no lo suficiente con la precisión de la ubicación . Por ejemplo, aquí hay un ejemplo de ajuste del rendimiento en el que se identificaron y corrigieron una serie de problemas de rendimiento, lo que dio como resultado una aceleración compuesta de 43 veces. No era esencial saber con precisión el tamaño de cada problema antes de solucionarlo, sino conocer su ubicación. Un fenómeno de ajuste de rendimiento es que solucionar un problema, al reducir el tiempo, aumenta los porcentajes de problemas restantes, por lo que son más fáciles de encontrar. Mientras se encuentre y solucione cualquier problema, se progresará hacia el objetivo de encontrar y solucionar todos los problemas. No es esencial corregirlos en orden de tamaño decreciente, pero es esencial señalarlos.

En el tema de la precisión estadística de medición, si hay un punto de llamada en la pila, se toma un porcentaje de tiempo F (como 20%) y N (como 100) muestras de tiempo aleatorio, luego el número de muestras que muestran la llamada el punto es una distribución binomial, con mean = NF = 20, desviación estándar = sqrt (NF (1-F)) = sqrt (16) = 4. Entonces el porcentaje de muestras que lo muestran será 20% +/- 4% . Entonces, ¿es eso exacto? No realmente, pero ¿se ha encontrado el problema? Precisamente.

De hecho, cuanto mayor es el problema, en términos de porcentaje, se necesitan menos muestras para localizarlo. Por ejemplo, si se toman 3 muestras y aparece un punto de llamada en 2 de ellas, es muy probable que sea muy costoso. (Específicamente, sigue una distribución beta. Si genera 4 números aleatorios uniformes y los clasifica, la distribución del tercero es la distribución del costo para ese punto de llamada. La media es (2 + 1) / ( 3 + 2) = 0.6, así que ese es el ahorro esperado, dadas esas muestras.) INSERTADO: Y el factor de aceleración que obtiene está gobernado por otra distribución, BetaPrime , y su promedio es 4. Entonces, si toma 3 muestras, vea una problema en 2 de ellos, y eliminar ese problema, en promedio hará que el programa sea cuatro veces más rápido.

Ya es hora de que los programadores nos quiten las telarañas sobre el tema de los perfiles.

Descargo de responsabilidad: el documento no hizo referencia a mi artículo: Dunlavey, "Ajuste del rendimiento con costo a nivel de instrucción derivado del muestreo de la pila de llamadas", avisos SIGLER de ACM 42, 8 (agosto de 2007), págs. 4-8.


Si lo leo correctamente, el documento solo habla de perfiles basados ​​en muestras . Muchos perfiladores también realizan perfiles basados ​​en instrumentación. Es mucho más lento y tiene algunos otros problemas, pero no debería sufrir los sesgos del documento.

La conclusión del documento es que no podemos creer realmente el resultado de los perfiladores. Pero entonces, ¿cuál es la alternativa de usar profilers?

No. La conclusión del documento es que los métodos de medición actuales de los "profilers" tienen defectos específicos. Proponen una solución. El documento es bastante reciente. Esperaría que los perfiladores implementaran esta corrección con el tiempo. Hasta entonces, incluso un generador de perfiles defectuoso es mucho mejor que "sentir".


Si no confía en los perfiladores, puede pasar al modo paranoia mediante el uso de programación orientada a aspectos, envolviendo cada método en su aplicación y luego usando un registrador para registrar cada invocación de método.

Su aplicación realmente se ralentizará, pero al menos tendrá un recuento preciso de cuántas veces se invoca cada método. Si también desea ver cuánto tarda cada método en ejecutar, perf4j cada método perf4j .

Después de descargar todas estas estadísticas en archivos de texto, use algunas herramientas para extraer toda la información necesaria y luego visualizarla. Supongo que esto te dará una idea bastante buena de lo lento que es tu aplicación en ciertos lugares.