# Manual de &kcachegrind;

## Introducción

&kcachegrind; es una herramienta para visualizar cómodamente la salida de herramientas de análisis de rendimiento de software. En este capítulo se explica para qué sirve este análisis, cómo se hace y algunos ejemplos de las herramientas disponibles.

### Análisis de rendimiento

Cuando se desarrolla un programa, una de las etapas finales consiste en optimizar su rendimiento. Dado que no es muy productivo dedicar mucho tiempo a optimizar funciones escasamente usadas, necesitaremos saber en qué partes del programa se concentra la mayoría del tiempo de ejecución.

Para el código secuencial, suele ser suficiente recabar datos estadísticos sobre características de ejecución de las aplicaciones, cosas como el tiempo que el programa pasa ejecutando una misma función o línea de código. Esto es lo que recibe el nombre de «profiling» (análisis de rendimiento). El programa se ejecuta bajo el control de una herramienta que será la que aporte información sobre la ejecución de un programa cuando esté se cierre. En contraste con esto, en el código paralelo los problemas de rendimiento suelen ser causa de que un procesador está esperando información de otro. Dado que no es sencillo reconocer esto, en este caso sería preferible generar un trazado de tiempos en que ocurren los eventos pero &kcachegrind; no puede visualizar estos datos.

Después de analizar los datos de rendimiento obtenidos, será sencillo ver los puntos fuertes y débiles del código: podremos, por ejemplo, comprobar el número de llamadas e identificar las partes del código que pueden ser optimizadas. Una vez optimizado el código, puede comprobarse si se ha hecho bien realizando otro análisis.

### Métodos de análisis de rendimiento

Para medir exactamente el tiempo transcurrido o registrar lo que sucede durante la ejecución de una determinada parte del programa (⪚ una función) será necesario añadir algún código antes y después de estas partes que nos permita realizar estas medidas. Este código cuenta el tiempo transcurrido o contabiliza algún evento y calcula diferencias. Esto hace que sea necesario cambiar el código original antes de ejecutarlo. esto recibe el nombre de instrumentación y puede realizarse por el propio programa, el compilador o el propio sistema en ejecución. Dados que las partes de interés suelen estar anidadas, la sobrecarga producida por las propias medidas a menudo influye en las propias medidas. La instrumentación debe hacerse selectivamente y sus resultados deben interpretarse con cuidado. Esto hace que el análisis de rendimiento mediante medidas exactas sea un proceso muy complejo.

La medición exacta es posible porque muchos procesadores modernos proporcionan contadores por hardware (incluidos los contadores que se incrementan en cada paso de tiempo), que se incrementan cada vez que ocurre un evento. Como queremos atribuir eventos a regiones de código, sin los contadores, tendremos que ocuparnos de cada evento incrementando nosotros mismos un contador para la región de código actual. Hacer esto por software no es, por supuesto, posible; pero, asumiendo que la distribución de eventos a lo largo del código fuente es similar cuando se mira solo cada enésimo evento en lugar de cada evento, se ha desarrollado un método de medición cuyos costes generales se pueden adecuar: se llama «muestreo». El muestreo basado en tiempo (&TBS;) usa un temporizador para mirar cada cierto tiempo el contador del programa para crear un histograma sobre el código fuente del programa. El muestreo basado en eventos (&EBS;) se aprovecha de los contadores por hardware de los procesadores modernos y usa un modo en el que se llama a un manejador de interrupción cada vez que se produce un subdesbordamiento para generar un histograma de la correspondiente distribución de eventos: en el manejador, el contador de eventos se reinicia siempre a valor n del método de muestreo. La ventaja del muestreo reside en que no hay necesidad de modificar el código fuente, aunque sigue teniendo una pega: la suposición anterior sería más correcta si n es pequeño, aunque cuanto menor sea n, mayor será el coste general del manejador de la interrupción.

Otro método de medida consiste en simular lo que ocurre en el sistema cuando se ejecuta un determinado código, &ie; ejecución de una simulación conducida. La simulación se realiza siempre partiendo de un modelo más o menos exacto del sistema, sin embargo es posible obtener modelos muy precisos que funcionen casi igual que en la realidad en los cuales el tiempo empleado en la simulación sea inaceptablemente alto. La ventaja de la simulación es que podemos insertar código más o menos complejo en el código a estudiar sin alterar los resultados. Es muy cómodo realizar esto directamente antes de la ejecución debido a que usamos el binario original sin necesidad de recompilarlo. La simulación es útil cuando se simulan solo partes de una máquina con un modelo sencillo, así además se obtienen resultados de más fácil interpretación. A menudo el problema de trabajar con hardware real es que varios efectos de diferentes partes de la máquina se solapan en un mismo resultado.

### Herramientas de análisis de rendimiento

La más conocida es la herramienta de análisis de GCC gprof; para usarla, debe compilar los programas a analizar con la opción `pg`, y al ejecutarlos se crea un archivo llamado `gmon.out` que puede convertirse a un formato legible mediante `gprof`. Una desventaja es que se necesita recompilar el programa y enlazarlo estáticamente. Este método se llama «instrumentación generada mediante el compilador», que mide los arcos de las llamadas entre funciones y el correspondiente número de llamadas -junto con el &TBS;- que aporta un histograma de distribución temporal en el código. Usando ambas fuentes de información, es posible calcular heurísticamente el tiempo dedicado a la ejecución de una función y el de todas las que han sido llamadas por ella.

Para medir con exactitud los eventos que están ocurriendo en un momento dado, están disponibles algunas librerías con funciones capaces de leer los contadores de rendimiento del hardware. Las más conocidas son el parche PerfCtr para &Linux; y las librerías PAPI y PCL independientes de la arquitectura del sistema. Aun así, es necesario instrumentalizar el código como en el caso anterior. Puede optar por usar las propias librerías o por sistemas de instrumentación automática como ADAPTOR (para la instrumentación de código en FORTRAN) o DynaProf (inyección de código a través de DynInst).

&oprofile; es un herramienta de análisis para &Linux; basada en el muestreo.

Una manera cómoda para realizar análisis consiste en el uso de &cachegrind; o &callgrind;, dos simuladores que usan la estructura de instrumentación de &valgrind;. Debido a que no es necesario recurrir a contadores por hardware (a menudo difíciles de acceder en las actuales distribuciones de &Linux;) y a que es posibles analizar los binarios sin modificarlos, es una buena alternativa a otras herramientas. Puede minimizar el problema de la ralentización causado por la simulación realizándola solo en las partes del programa que le interesen e incluso en unos pocos ciclos de algún bucle.Sin medir/simular la instrumentación, el uso de &valgrind; solo tiene un factor de ralentización en un rango de 3 a 5. También es posible desactivar la simulación de caché si solo nos interesan el gráfico y el número de llamadas.

La simulación del caché es el primer paso para aproximarnos a los tiempos de ejecución reales ya que el tiempo de ejecución es muy sensible a la explotación de los llamados caches, buffers pequeños y rápidos que aceleran accesos repetidos a las mismas celdas de memoria, en sistemas modernos. &cachegrind; realiza la simulación de caché capturando dichos accesos. La información obtenida incluye el número de la instrucción o acceso a memoria y los fallos de caché de primer y segundo nivel, y las relaciona con las líneas de código fuente y con las funciones del programa ejecutado. Combinando los datos de dichos fallos mediante las latencias en fallo de los procesadores más comunes, es posible obtener una estimación del tiempo empleado.

&callgrind; es una extensión de &cachegrind; que crea el gráfico de llamadas de un programa al vuelo, &ie; como las funciones se llaman entre sí y cuantos eventos ocurren mientras se ejecuta una función. También es posible separar la información a recabar por hilos o por contextos de llamadas. Puede aportar datos de rendimiento a nivel de instrucción para permitir anotar código desensamblado.

### Visualización

Las herramientas de análisis de rendimiento suelen producir gran cantidad de información. El deseo de navegar fácilmente por el gráfico de llamadas, poder alternar fácilmente el orden de listado de las funciones y ver los distintos tipos de eventos hicieron que se escribiera una interfaz gráfica para ello.

&kcachegrind; es una herramienta para visualizar información de rendimiento que cumple estas características. Aunque fue pensada para visualizar la información generada por &cachegrind; y &calltree;, existen conversores para mostrar datos de otras herramientas. En el apéndice puede ver una descripción del formato usado en los archivos de &cachegrind;/&callgrind;.

Aparte de una lista de funciones ordenadas según la métrica de sus costes inclusivos o exclusivos y, opcionalmente, agrupadas por el archivo fuente, biblioteca compartida o clase C++, &kcachegrind; también ofrece varias vistas para un función determinada, como:

- un gráfico de llamadas que muestra la sección del gráfico de llamadas que rodea a la función seleccionada,

- un mapa en forma de árbol que permite ver las relaciones entre funciones anidadas conjuntamente con datos sobre el coste computacional que acarrean para que puede detectar enseguida funciones problemáticas,

- vistas del código fuente y anotaciones del desensamblador para que pueda disponer de información del coste computacional de dichas líneas de código e instrucciones de ensamblador.

## Uso de &kcachegrind;

### Generar datos para visualizar

En primer lugar, es necesario obtener información del rendimiento midiendo varios aspectos sobre una aplicación en ejecución mediante el uso de una herramienta de análisis de rendimiento. &kcachegrind; no incluye ninguna herramienta para ello, pero trabaja muy bien en conjunción con &callgrind; y, si usa un conversor, también con &oprofile;. Aunque no es el objetivo de este manual dar una explicación detallada acerca de estas herramientas, en la siguiente sección se dan algunas ideas básicas para que pueda empezar a trabajar.

#### &callgrind;

&callgrind; es parte de &valgrind;, &valgrind;. Observe que antes se denominaba &calltree;, pero el nombre podía inducir a error.

Su uso más común consiste en ejecutar la orden que inicia su aplicación precedida de ``valgrind` `--tool=callgrind`` , como en

> ``valgrind` `--tool=callgrind` `miprograma` `misargs``

Cuando cierre el programa, se creará un archivo llamado `callgrind.out.`pid`` que se puede cargar en &kcachegrind;.

Un uso más avanzado sería realizar un volcado de análisis de rendimiento cada vez que se invoca una determinada función de la aplicación. Por ejemplo, si solo desear ver los datos del análisis de rendimiento del renderizado de páginas web en &konqueror;, podría querer volcar los datos cada vez que seleccione la opción del menú Ver Volver a cargar. La llamada que le interesaría en este caso sería `KonqMainWindow::slotReload`. Use:

> ``valgrind` `--tool=callgrind` `--dump- before=KonqMainWindow::slotReload` `konqueror``

Esto producirá varios archivos de análisis de rendimiento con un número de secuencia al final de sus nombres. También se creará un archivo sin ese número final (terminado solo en el PID del proceso). Al cargar este archivo en &kcachegrind;, también se cargarán los demás de forma automática, y podrá verlos en la Vista general de partes y la lista de Partes.

#### &oprofile;

&oprofile; está disponible en su página web. Para instalarlo, siga las instrucciones ahí proporcionadas, pero antes, compruebe si está disponible como paquete para su distribución (como &SuSE;).

El análisis de rendimiento a nivel del sistema solo puede hacerse con privilegios de root porque se precisa observar todas las acciones que lleva a cabo el sistema; por ello, lo siguiente debe hacerse como root. En primer lugar, configure el proceso mediante la &GUI; `oprof_start` o la orden `opcontrol`. La configuración estándar debería estar en modo temporizador (&TBS;, consulte la introducción). Para comenzar la medida, ejecute ``opconrtol` `-s``. A continuación ejecute la aplicación en la que está interesado y, posteriormente, ejecute ``opcontrol` `-d``. Esto escribirá el resultado de la medida en archivos del directorio `var/lib/oprofile/samples/`. Para poder visualizar los datos en &kcachegrind;, deberá ejecutar

> ``opreport` `-gdf` | `op2callgrind``

en un directorio vacío. Esto creará un gran número de archivos, uno por cada programa que se esté ejecutando en el sistema. Podrá cargar cada uno de ellos separadamente en &kcachegrind;.

### Fundamentos de la interfaz de usuario

Cuando abra &kcachegrind; con un archivo de información de perfil como argumento, o después de cargar uno a través de Archivo Abrir , verá una barra lateral de navegación a la izquierda que contiene la lista de funciones y a la derecha, la parte principal, un área con vistas de la función seleccionada. Esta área de vista se puede configurar arbitrariamente para mostrar varias vistas al mismo tiempo.

En la primera ejecución, esta área estará dividida en una parte superior y otra inferior, cada una de ellas con diferentes vistas de pestañas que puede seleccionar. Use el menú contextual de las pestañas para mover las vistas y ajuste los separadores que hay entre ellas. Para cambiar rápidamente entre distintos esquemas de vistas use &Ctrl;→ Ver Distribución Ir a siguiente y &Ctrl;← Ver Distribución Ir a anterior.

El tipo de evento activo es importante para la visualización: para &callgrind; puede ser, por ejemplo, fallos de caché o estimación de ciclos; para &oprofile; es «temporizador» en el caso más sencillo. Puede cambiar el tipo de evento usando una lista desplegable en la barra de herramientas o en la vista de Tipos de evento. Si selecciona la función `main` en la lista de la izquierda debería ver un resumen de las características de ejecución. Observe en ese momento la vista del gráfico de llamadas. En él verá las llamadas que tienen lugar en el programa. Observe que el gráfico de llamadas solo muestra las funciones que más veces se emplean. Si hace doble clic en una función del gráfico verá que cambia para mostrarle las funciones invocadas en torno a la seleccionada.

Para conocer mejor la &GUI; de este programa, además de leer este manual, debería consultar la documentación disponible en la página web. También puede consultar la ayuda ¿Qué es esto? de cada widget de &kcachegrind;.

## Conceptos básicos

En este capítulo se tratan algunos conceptos de &kcachegrind; y se introducen algunos de los términos usado en la interfaz.

### El modelo de datos para la información de rendimiento

#### Entidades de costes

La contabilización de los costes computacionales de los tipos de eventos (tales como las pérdidas L2) s atribuyen a las entidades de costes, relacionadas con el código fuente o las estructuras de datos de un programa dado. Estas no solo pueden representar simples posiciones en el código o en los datos sino también registros complejos de una posición. P.ej. una llamada tiene una fuente y un objetivo o una dirección de datos puede tener un tipo de datos y una posición en el código donde se originó.

Las entidades de coste reconocidas por &kcachegrind; vienen dadas en las siguientes posiciones:

- Instrucción. Una instrucción en ensamblador en una dirección especificada.

- Línea de código de una función. Todas las instrucciones que el compilador (a través de la información de depuración) mapea para una línea de código, identificada por el nombre del archivo y por el número de línea y que son ejecutadas en el contexto de una función. Una línea de código de una función incorporada («inline») podrá aparecer en el contexto de varias funciones. Las instrucciones que sin ninguna referencia a una línea de código aparecen referenciadas a la línea 0 del archivo «???».

- Función. Todas las líneas de código de que está constituida una función componen la función en si. Está identificada por su nombre y por su localización si estuviese disponible. esta última es necesaria porque los binarios de un programa podrán contener funciones con el mismo nombre. Si un analizador de rendimiento no es capaz de detectar el nombre del símbolo de una función, p. ej. porque no está disponible la información de depurado, suele usarse la dirección de la primera instrucción ejecutada o «???».

- Objeto binario. Todas las funciones cuyo código está dentro del rango de un determinado objeto binario ya sea el ejecutable principal o una librería dinámica.

- Archivo de código fuente. Todas las funciones cuya primera instrucción está referenciada en una línea de dicho archivo.

- Clase. en general, los nombre de las funciones suelen estar ordenados de forma jerárquica en espacios de nombres, ⪚ los «namespaces» de C++ o las clases de los lenguajes de programación orientados a objetos. Como tal, una clase puede contener funciones de dicha clase u otras clases incluidas en ella.

- Parte del análisis. Alguna sección de la ejecución de un análisis con un determinado ID de hilo, proceso y línea de órdenes ejecutada.

. Tal como se ve en la lista, un conjunto de entidades de coste suele definir otra entidad de coste, por tanto existe una jerarquía de inclusión que debería ser obvia con la explicación anterior.

Tuplas de posiciones:

- Llamada desde la dirección de una instrucción a la función de destino.

- Llamada desde una línea de código a la función de destino.

- Llamada desde una función origen a otra destino.

- Salto (in)condicional desde una instrucción de origen a otra de destino

- Salto (in)condicional desde una línea de código a otra de destino

No se permiten saltos entre funciones, ya que no tendrían sentido en un gráfico de llamadas. Así, las construcciones como el tratamiento de excepciones y los saltos largos de C, tendrán que traducirse en saltos en la pila de llamadas según las necesidades.

#### Tipos de eventos

Es posible especificar tipos arbitrarios de eventos en la información de rendimiento simplemente asignándole un nombre. Su coste computacional en relación a una entidad de coste es un número de 64 bits.

Los tipos de eventos cuyos costes se especifican en un informe de rendimiento se denominan eventos reales. También es posible especificar fórmulas para eventos calculados a partir de los reales, los denominados eventos heredados.

### Estado de visualización

El estado de visualización de una ventana de &kcachegrind; incluye:

- los tipos primario y secundario de los eventos seleccionados para mostrarse,

- el agrupamiento de funciones (usado en la lista de análisis de rendimiento de funciones y en el resaltado de la entidad),

- las partes del análisis cuyos costes se van a incluir en la visualización

- una entidad de coste activa (⪚, una función seleccionada en la barra de análisis de rendimiento de la función),

- una entidad de coste seleccionada.

. Este estado influye en las visualizaciones.

Las vistas se muestran siempre para la entidad de coste activa. Cuando una vista determinada no es adecuada para ella, se desactiva: por ejemplo, si selecciona un objeto &ELF; de la lista de grupo, la anotación de la fuente no tiene sentido.

Por ejemplo, para una función activa la lista de llamantes muestra todas las funciones llamadas desde la activa: es posible seleccionar una de ellas sin activarla. También, si el gráfico de llamadas está visible, seleccionará automáticamente la misma función.

### Partes de la &GUI;

#### Barras laterales

Las barras laterales (empotrables) son pequeñas ventanas que pueden situarse en cualquier lateral de una ventana de &kcachegrind;. Siempre contienen una lista de entidades de coste listadas según cierto criterio.

- El Análisis de función es una lista de funciones con sus costes inclusivos y exclusivos, número de llamadas y el nombre y posición de las funciones.

- Vista de las partes

- Pila de llamadas

#### Área de visualización

El área de visualización, generalmente la parte derecha de la ventana principal de &kcachegrind;, está formada por una (por omisión) o más pestañas alineadas vertical u horizontalmente. Cada pestaña permite visualizar información diferente de una sola entidad de coste al mismo tiempo. El nombre de dicha entidad aparece en la parte superior de la pestaña. Si hay varias pestañas, solo una de ellas estará activa. El nombre de la entidad de la pestaña activa aparece en negrita y determina la entidad de coste activa en la ventana de &kcachegrind;.

#### Áreas de una pestaña

Cada pestaña puede contener hasta cuatro áreas de visualización llamadas: superior, inferior, izquierda y derecha. Cada área puede contener varias vistas apiladas. La parte visible de un área se selecciona mediante una barra de pestañas. Las barras de pestañas de las áreas superior y derecha están en la parte superior; las barras de pestañas de las áreas inferior e izquierda están en la parte inferior. A través del menú contextual de las pestañas podrá escoger el tipo de visualización que desee.

#### Vista sincronizada con una entidad seleccionada en una pestaña

Aparte de una entidad activa, cada pestaña tiene un entidad seleccionada. Dado que la mayoría de los tipos de visualización muestran varias entidades con la activa en el centro, podrá cambiar el elemento seleccionado navegando dentro de la vista (haciendo clic con el ratón o usando el teclado). Lo normal es que los objetos seleccionados se muestran resaltados. Si cambia la entidad seleccionada en una de las vistas de una pestaña, el resto de vistas también resaltarán la nueva entidad seleccionada.

#### Sincronización entre pestañas

Si existen varias pestañas, al cambiar la selección en una de ellas también se cambiará la selección en la siguiente, ya sea a la derecha de la primera o bajo ella. Este tipo de asociaciones debería, por ejemplo, facilitarle la navegación entre los gráficos de llamadas.

#### Disposiciones

Es posible guardar la disposición de todas las pestañas de una ventana (consulte Ver Disposición). Tras duplicar la disposición actual (&Ctrl; + Ver Disposición Duplicar ) y cambiar el tamaño o mover una vista a otro área de una pestaña, también podrá cambiar rápidamente entre la disposición anterior y la actual mediante el &Ctrl;← y &Ctrl;→. El conjunto de disposiciones se guarda entre las sesiones de &kcachegrind; de la misma orden analizada. Puede fijar el conjunto de disposiciones actual para usar de forma predeterminada en las siguientes sesiones de &kcachegrind; o restaurar el conjunto de disposiciones por omisión.

### Barras laterales

#### Análisis sencillos

El Análisis de rendimiento plano contiene una lista de grupos y otra lista de funciones. La lista de grupos contiene todos los grupos entre los cuales está repartido el coste, según el tipo de grupo escogido. La lista de grupos permanece oculta cuando está desactivada la agrupación.

La lista de funciones contiene las funciones del grupo seleccionado (o todas las funciones si está desactivada la opción de agrupamiento) ordenadas según una de las columnas, ⪚ incluso el coste propio. Puede configurar el número máximo de funciones que se muestran en Preferencias Configurar KCachegrind.

#### Vista de las partes

Durante la ejecución de un análisis pueden crearse varios archivos con la información obtenida y que puede cargar conjuntamente en &kcachegrind;. La barra móvil del Resumen de secciones se los mostrará ordenados horizontalmente según la hora de su creación; el tamaño de los cuadros es proporcional a los costes de cada una de las partes. Podrá seleccionar una o varias partes para restringir únicamente a ellas los costes mostrados en otras vistas de &kcachegrind;.

Las partes se subdividen entre un particionamiento y un modo de separación de costes inclusivos:

Modo de particionamiento

- El particionamiento se muestra en grupos pora una parte de datos de perfil, de acuerdo conel tipo de grupo seleccionado. Por ejemplo, si se seleccionan grupos de objetos &ELF;, verá rectángulos coloreados para cada objeto &ELF; usado (biblioteca compartida o ejecutable), con un tamaño acorde al coste invertido en el mismo.

Modo de diagrama

- Se muestra un rectángulo con el coste inclusivo de la función activa en esa parte. Este a su vez se dividirá para mostrar los costes inclusivos de las funciones que llama.

#### Pila de llamadas

Es una pila de las llamadas más probables, totalmente ficticia. Se crea a partir de la función activa en ese momento, y se le añaden los llamantes/llamadas con los mayores costes al principio y al final.

Las columnas Coste y Llamadas muestra el coste usado para todas las llamadas desde la función en la línea de arriba.

### Vistas

#### Tipos de eventos

La lista Tipo de evento muestra todos los tipos de costes disponibles y los correspondientes costes propios e inclusivos de la función activa para este tipo de evento.

Escogiendo un tipo de evento de la lista, cambiará el tipo de costes mostrados por todo &kcachegrind; al seleccionado.

#### Listas de llamadas

Estas listas muestran todas las llamadas desde y hacia la función activa. Con Todos los llamantes y Todos los llamados nos referimos a aquellas funciones accesibles en ambas direcciones, incluso cuando existen funciones intermedias.

La lista de llamadas incluye:

- Llamantes directos

- Llamadas directas

- Todos los llamantes

- Todos los llamados

#### Mapas

Una visualización en árbol del tipo de evento primario a través de la jerarquía de llamadas. Cada uno de los cuadros coloreados representa una función; su tamaño intenta ser proporcional al coste (piense que las representaciones gráficas tienen sus limitaciones) durante la ejecución de la función.

Para el Mapa de llamantes, el gráfico muestra la jerarquía anidada de todas las llamantes de la función activada; parar el Mapa de llamadas, se mostrará la misma información de todas las llamadas de la función activa.

El menú contextual puede encontrar opciones sobre el aspecto visual. Si desea obtener proporciones exactas, seleccione Ocultar bordes incorrectos. Como esta opción puede necesitar mucho tiempo, es posible que primero quiera limitar el nivel máximo de anidamiento. Mejor determina la dirección de reparto de los descendientes a partir de las proporciones de los ascendientes. Siempre el mejor decide sobre el espacio restante de cada elemento del mismo nivel. Ignorar proporciones reserva espacio para el nombre de la función antes de dibujar sus descendientes. Observe que las proporciones pueden resultar bastante erróneas.

Puede navegar con el teclado usando las teclas izquierda y derecha para recorrer los elementos del mismo nivel, y las teclas arriba y abajo para subir o bajar por los niveles de anidamiento. &Enter; activa el elemento actual.

#### Gráfico de llamadas

Esta vista muestra el gráfico de llamadas alrededor de la función activada. El coste que se muestra es únicamente el correspondiente a la ejecución de la función activa; &ie;, el coste mostrado para la función `main()` (si es visible) debería ser el mismo que el de la función activa, ya que es la parte del coste inclusivo de `main()` gastado mientras se ejecuta la función activa.

En el caso de ciclos, las flechas de llamadas en azul indican que se trata de una llamada artificial, que no ha llegado a ocurrir, añadida para corregir el gráfico.

Si el gráfico resulta ser mayor que el área de diseño, se mostrará una vista general en uno de los lados. Existen otras opciones de visualización al igual que el árbol de llamadas, la función seleccionada aparece resaltada.

#### Anotaciones

Las listas anotadas de código fuente o de ensamblador muestran las líneas de código fuente o de instrucciones desensambladas de la función activa actual junto con el coste gastado en ejecutar el código de una línea de código o instrucción. Si hay una llamada, se insertan algunas líneas en el código con detalles acerca de la misma: el coste (inclusivo) gastado dentro de la llamada, el número de llamadas que ocurren y el destino de la llamada.

Si selecciona una de esas líneas de información sobre la llamada se activará el destino de la llamada.

## Referencia de comandos

### Ventana principal de &kcachegrind;

#### El menú Archivo

&Ctrl;N Archivo Nuevo

- Abre una nueva ventana vacía de nivel superior donde cargar el informe de rendimiento. Esto no es realmente necesario dado que seleccionando Archivo Abrir también abrirá una nueva ventana si la actual está mostrando otros datos.

&Ctrl;O Archivo Abrir

- Abre el diálogo de apertura de archivo de &kde; para que pueda cargar un archivo de informe de rendimiento. Si ya tiene información cargada en la ventana principal, se abrirá otra. Si desea abrir más datos de rendimiento en la ventana actual, utilice Archivo Añadir.

  Los nombres de los archivos de análisis suelen terminar en `.`pid`.`.parte`-`IDhilo``, donde `parte` e `IDhilo` son opcionales. `pid` y `parte` se usan cuando varios archivos de análisis de rendimiento pertenecen a la ejecución de un mismo programa. Cuando se cargue un archivo terminado únicamente en ``pid``, también se cargarán otros archivos de datos existentes con terminaciones adicionales para dicha ejecución.ejecución

  Si existen los archivos de datos de perfil `cachegrind.out.123` y `cachegrind.out.123.1`, al cargar el primero también se cargará automáticamente el segundo.

Archivo Añadir

- Añade un archivo de análisis de rendimiento en la ventana actual. Con esta opción puede cargar varios archivos en una misma ventana aunque no correspondan a la misma ejecución, como proporcionados por la convención de nombres del archivo del análisis de rendimiento. Esto puede ser útil, por ejemplo, para comparar dos casos.

F5 Archivo Volver a cargar

- Vuelve a cargar la información de rendimiento. Es útil después de haber generado otro archivo de datos de análisis para una ejecución ya cargada de una aplicación.

&Ctrl;Q Archivo Salir

- Cierra &kcachegrind;

## Preguntas y respuestas

¿Qué es &kcachegrind;? No consigo hacerme una idea.

&kcachegrind; es una herramienta útil en una de las últimas fases del desarrollo de un programa llamada análisis de rendimiento. Si no desarrolla aplicaciones, no necesita &kcachegrind;.

¿Cuál es la diferencia entre Inclusivo y Propio?

Ambas son atributos de los costes para funciones de unos determinados tipos de eventos. Dado que las funciones se llaman entre si, tiene sentido distinguir el coste de la propia función («coste propio») y el coste de la misma más todas las funciones invocadas («coste inclusivo»). «Self» también se puede llamar coste «exclusivo».

Así, por ejemplo,. para la función `main()`, siempre verá un coste inclusivo cercano al 100 %, mientras el coste propio es insignificante cuando el trabajo real se realiza en otra función.

Si hace doble clic sobre una función del Gráfico de llamadas, se mostrará para la función `main()` el mismo coste que para la función seleccionada. ¿No se supone que debe ser constante al 100 %?

Ha activado un función descendiente de `main()` con un coste evidentemente menor que la propia función `main()`. Para todas las funciones, solo se muestra la parte del coste gastado mientras se ejecuta la función activada; es decir, que el coste que se muestra para cualquier función nunca puede ser mayor que el de la función activada.

Entidad de costes

Concepto abstracto relacionado con el código fuente del programa al que se pueden atribuir contadores de eventos. Las dimensiones de las entidades de coste son posiciones del código (⪚, línea de código, función), ubicación de datos (⪚, el tipo de datos a los que se accede, objeto de los datos), ubicación de la ejecución (⪚, tarea, proceso) y tuplas o tripletes de las posiciones indicadas anteriormente (⪚, llamadas, acceso a objetos desde la instrucción, datos obtenidos a partir de la caché).

Costes de los eventos

Suma de eventos de algún tipo de evento que ocurre mientras la ejecución se relacione con alguna entidad de coste. El coste se atribuye a la entidad.

Tipo de evento

El tipo de evento cuyos costes se le pueden atribuir a una entidad de coste. Existen tipos de eventos reales y heredados.

Tipo de evento heredado

Un tipo de evento virtual, solo visible en la vista y definido por una fórmula resoluble a partir de tipos de eventos reales.

Archivo de datos de perfil

Un archivo que contiene datos medidos durante el análisis de rendimiento (o parte del mismo) o producidos al postprocesar una traza. Su tamaño suele ser similar al del código del programa.

Parte de datos de perfil

Datos de un archivo de datos de análisis.

Experimento de análisis de rendimiento

Un programa ejecutado bajo el control de una herramienta de análisis de rendimiento, generando varios archivos con información de rendimiento de sus partes o de los hilos de la ejecución.

Proyecto de perfil

Configuración del experimento de análisis de rendimiento usado para el programa a analizar, posiblemente con múltiples versiones. En general, las comparaciones de análisis solo tienen sentido con datos de un único proyecto.

Análisis de rendimiento

Proceso mediante el cual se recoge información estadística sobre la ejecución de un programa en tiempo real.

Tipo de evento real

Un tipo de evento que se puede medir con una herramienta, siempre que se tenga el sensor adecuado.

Traza

Secuencia temporal de los eventos ocurridos mientras se analizaba la ejecución de un programa. Su tamaño suele ser directamente proporcional al tiempo de ejecución del programa.

Sección de traza
Trazado

El proceso mediante el cual se supervisa la ejecución de un programa y se registran sus eventos, ordenados por fecha, en un archivo de salida llamado traza.

## Créditos y licencia

Gracias a Julian Seward por su excelente herramienta &valgrind; y a Nicholas Nethercote por añadirle &cachegrind;. Sin estos programas, &kcachegrind; no existiría. También han contribuido con algunas ideas para esta &GUI;.

Gracias a todos los usuarios que enviaron informes de fallos y sugerencias.

Traducido por Marcos Fouces Lago mfouces@yahoo.es y Cristina Yenyxe González García the.blue.valkyrie@gmail.com

&underFDL;
&documentation.index;