Ver los cuellos de botella del rendimiento

Los cuellos de botella del rendimiento pueden identificarse rápidamente utilizando las vistas estadísticas.  Este tema describe un caso práctico en el que tratamos de mejorar el tiempo de ejecución. La vista Estadísticas de paquete es un buen punto de partida porque identifica los paquetes responsables de la lentitud de la ejecución. Desde aquí, buscaremos la clase o el método responsables del pobre rendimiento de la ejecución.

Al lanzar la aplicación que se desea perfilar, habilitamos la recogida de información de flujo de ejecución.  (Seleccione la opción de perfilado, Mi aplicación es muy lenta y, en las opciones de Detalles, seleccione Mostrar detalles gráficos del flujo de la ejecución.)   

La vista Estadísticas de paquete, tiene el aspecto siguiente cuando se abre:

 

Esta vista muestra estadísticas de las distintas clases, agrupadas por los paquetes que las contienen.  La vista puede personalizarse para visualizar cualquier tipo de datos estadísticos, como por ejemplo, la asignación de memoria o las estadísticas basadas en tiempo.  En nuestro caso, vamos a asegurarnos de que las columnas relacionadas con el tiempo sean visibles porque contienen la información que necesitamos. (Pulse con el botón derecho, seleccione Elegir columnas y establezca la visibilidad de estas columnas.)  También ordenaremos los paquetes mediante la columna de Tiempo base de ejecución.  Tal como puede ver más arriba, el paquete com.ibm.ws.ejbpersistence.dataaccess es el "punto caliente" de la ejecución, y dentro de este paquete, DataAccessRequestImpl e la clase responsable de la ralentización.

Una vez obtenida esta información nos dirigimos a la vista Estadísticas de clase e identificamos el método responsable del bajo rendimiento general de la clase.   


Ahora podemos ver claramente que el método execute es el responsable del bajo rendimiento de la clase DataAccessRequestImpl; su tiempo de ejecución es muy alto comparado con el tiempo invertido en el otro método, executeOneRowFBPK.

Observemos antentamente la vista Estadísticas de clase. Hay un punto realmente interesante que merece la pena comentar: la clase java.text.NumberFormat está junto a la lista de clases responsables de la lentitud de la ejecución. En concreto, el tiempo transcurrido en esa clase se dedica a java.text.NumberFormat.getCurrencyInstance(). Esto puede darle una idea de lo que cuesta utilizar algunos métodos aparentemente simples. Incluso aunque NumberFormat.getCurrencyInstance() sea una API simple, el hecho de llamarla muchas veces puede tener un gran impacto sobre el rendimiento general de la aplicación.

Ahora vamos a las invocaciones de método para el método DataAccessRequestImpl.execute(). Una característica poderosa de la herramienta de perfilado es la representación gráfica de la ejecución de la aplicación, que permite ver la ejecución del método en el nivel de invocación del mismo. Esta vista es útil porque puede ver el patrón de ejecución y las diferencias entre invocaciones en el mismo método.  Aquí está la vista Invocación de método para ilustrar la invocación del método DataAccessRequestImpl.execute().


 

Desde este gráfico puede ver lo que ha llamado esta invocación en la pila de la ejecución o saltar al código fuente del método.  También puede ver el tiempo transcurrido haciendo flotar el cursor sobre cualquier barra.

La tabla Invocación de método que se muestra a continuación muestra las mismas invocaciones de método pero en forma de tabla. Es interesante advertir que para la primera invocación de método, el tiempo de ejecución (vea la columna Tiempo acumulativo) es muy alto en comparación con posteriores invocaciones de método.


 

Analizando la pila de llamada de las invocaciones de método, podemos entender la razón por la cual esta invocación específica ha sido más lenta que el resto de ejecuciones de método. Buscando el patrón de las invocaciones de método, encontramos que la primera llamada al método OnlineItembean.FindByValue(IndexedObject) tarda más que el resto de invocaciones de método.

Así, finalmente, encontramos que el método responsable de que el tiempo de ejecución sea largo en general, es la primer invocación del método OnlineItembean.FindByValue.

 

Conceptos relacionados
Visión general de la herramienta de perfilado

Tareas relacionadas
Perfilar una aplicación
Lanzar o conectar un proceso Java

 
 

>