Elaboración de perfiles (programación informática) - Profiling (computer programming)

En ingeniería de software , la creación de perfiles ("creación de perfiles de programas", "creación de perfiles de software") es una forma de análisis dinámico de programas que mide, por ejemplo, el espacio (memoria) o la complejidad temporal de un programa , el uso de instrucciones particulares o la frecuencia. y duración de las llamadas a funciones. Por lo general, la información de creación de perfiles sirve para ayudar a la optimización del programa y, más específicamente, a la ingeniería del rendimiento .

La creación de perfiles se logra mediante la instrumentación del código fuente del programa o su forma binaria ejecutable utilizando una herramienta llamada perfilador (o perfilador de código ). Los perfiladores pueden utilizar varias técnicas diferentes, como métodos basados ​​en eventos, estadísticos, instrumentados y de simulación.

Reuniendo eventos del programa

Los perfiladores utilizan una amplia variedad de técnicas para recopilar datos, incluidas las interrupciones de hardware , la instrumentación de código , la simulación de conjuntos de instrucciones , los enlaces del sistema operativo y los contadores de rendimiento .

Uso de perfiladores

Salida gráfica del generador de perfiles CodeAnalyst .

Las herramientas de análisis de programas son extremadamente importantes para comprender el comportamiento del programa. Los arquitectos informáticos necesitan estas herramientas para evaluar el rendimiento de los programas en las nuevas arquitecturas . Los escritores de software necesitan herramientas para analizar sus programas e identificar secciones críticas de código. Los escritores de compiladores a menudo usan tales herramientas para averiguar qué tan bien se está desempeñando su programación de instrucciones o su algoritmo de predicción de rama ...

-  ATOM, PLDI , '94

La salida de un generador de perfiles puede ser:

  • Un resumen estadístico de los eventos observados (un perfil )
La información resumida del perfil a menudo se muestra anotada contra las declaraciones del código fuente donde ocurren los eventos, por lo que el tamaño de los datos de medición es lineal con el tamaño del código del programa.
/* ------------ source------------------------- count */             
0001             IF X = "A"                     0055
0002                THEN DO                       
0003                  ADD 1 to XCOUNT           0032
0004                ELSE
0005             IF X = "B"                     0055
  • Un flujo de eventos registrados (un rastro )
Para los programas secuenciales, un perfil de resumen suele ser suficiente, pero los problemas de rendimiento en los programas paralelos (en espera de mensajes o problemas de sincronización) a menudo dependen de la relación temporal de los eventos, por lo que se requiere un seguimiento completo para comprender lo que está sucediendo.
El tamaño de una traza (completa) es lineal a la longitud de la ruta de instrucción del programa , lo que lo hace poco práctico. Por lo tanto, una traza puede iniciarse en un punto de un programa y terminarse en otro punto para limitar la salida.
  • Una interacción continua con el hipervisor (monitoreo continuo o periódico a través de visualización en pantalla, por ejemplo)
Esto brinda la oportunidad de activar o desactivar un seguimiento en cualquier punto deseado durante la ejecución, además de ver las métricas en curso sobre el programa (aún en ejecución). También brinda la oportunidad de suspender procesos asincrónicos en puntos críticos para examinar las interacciones con otros procesos paralelos con más detalle.

Un generador de perfiles se puede aplicar a un método individual oa la escala de un módulo o programa, para identificar los cuellos de botella en el rendimiento haciendo que el código de larga ejecución sea obvio. Se puede utilizar un generador de perfiles para comprender el código desde el punto de vista del tiempo, con el objetivo de optimizarlo para manejar varias condiciones de tiempo de ejecución o varias cargas. Los resultados de generación de perfiles pueden ser ingeridos por un compilador que proporciona optimización guiada por perfiles . Los resultados de la creación de perfiles se pueden utilizar para guiar el diseño y la optimización de un algoritmo individual; el algoritmo de comodines de coincidencia de Krauss es un ejemplo. Los perfiladores están integrados en algunos sistemas de gestión del rendimiento de las aplicaciones que agregan datos de creación de perfiles para proporcionar información sobre las cargas de trabajo de transacciones en aplicaciones distribuidas .

Historia

Las herramientas de análisis de rendimiento existían en las plataformas IBM / 360 e IBM / 370 desde principios de la década de 1970, generalmente basadas en interrupciones de temporizador que registraban la palabra de estado del programa (PSW) a intervalos de temporizador establecidos para detectar "puntos calientes" en la ejecución de código. Este fue un ejemplo temprano de muestreo (ver más abajo). A principios de 1974 , los simuladores de conjuntos de instrucciones permitían el seguimiento completo y otras funciones de supervisión del rendimiento.

El análisis de programas basado en perfiles en Unix se remonta a 1973, cuando los sistemas Unix incluían una herramienta básica prof, que enumeraba cada función y cuánto tiempo de ejecución del programa usaba. En 1982 gprofamplió el concepto a un análisis de gráfico de llamadas completo .

En 1994, Amitabh Srivastava y Alan Eustace de Digital Equipment Corporation publicaron un artículo que describe ATOM (Herramientas de análisis con OM). La plataforma ATOM convierte un programa en su propio generador de perfiles: en el momento de la compilación , inserta el código en el programa a analizar. Ese código insertado genera datos de análisis. Esta técnica - modificar un programa para analizarse a sí mismo - se conoce como " instrumentación ".

En 2004, los artículos gprofy ATOM aparecieron en la lista de los 50 artículos PLDI más influyentes para el período de 20 años que finalizó en 1999.

Tipos de perfiladores basados ​​en la salida

Perfilador plano

Los perfiladores planos calculan los tiempos de llamada promedio, a partir de las llamadas, y no desglosan los tiempos de llamada según el destinatario o el contexto.

Generador de perfiles de gráfico de llamadas

Los perfiladores de gráficos de llamadas muestran los tiempos de llamadas y las frecuencias de las funciones, y también las cadenas de llamadas involucradas en función del destinatario. En algunas herramientas no se conserva el contexto completo.

Perfilador sensible a la entrada

Los perfiladores sensibles a la entrada añaden una dimensión adicional a los perfiladores planos o de gráficos de llamadas al relacionar las medidas de rendimiento con las características de las cargas de trabajo de entrada, como el tamaño de entrada o los valores de entrada. Generan gráficos que caracterizan cómo se escala el rendimiento de una aplicación en función de su entrada.

Granularidad de datos en tipos de perfiladores

Los perfiladores, que también son programas en sí mismos, analizan los programas objetivo mediante la recopilación de información sobre su ejecución. En función de la granularidad de sus datos, de cómo los perfiladores recopilan información, se clasifican en perfiladores estadísticos o basados ​​en eventos. Los perfiladores interrumpen la ejecución del programa para recopilar información, lo que puede resultar en una resolución limitada en las mediciones de tiempo, que deben tomarse con cautela. Los perfiladores de bloques básicos informan de un número de ciclos de reloj de la máquina dedicados a ejecutar cada línea de código, o un tiempo basado en sumarlos; los tiempos informados por bloque básico pueden no reflejar una diferencia entre aciertos y errores de caché .

Perfiladores basados ​​en eventos

Los lenguajes de programación enumerados aquí tienen perfiladores basados ​​en eventos:

  • Java : la API JVMTI (JVM Tools Interface), anteriormente JVMPI (JVM Profiling Interface), proporciona enlaces a los perfiladores, para atrapar eventos como llamadas, class-load, unload, thread enter y dejar.
  • .NET : puede adjuntar un agente de creación de perfiles como servidor COM al CLR mediante la API de creación de perfiles . Al igual que Java, el tiempo de ejecución proporciona varias devoluciones de llamada al agente, para atrapar eventos como el método JIT / entrar / salir, creación de objetos, etc. Particularmente poderoso porque el agente de creación de perfiles puede reescribir el código de bytes de la aplicación de destino de formas arbitrarias.
  • Python : la creación de perfiles de Python incluye el módulo de perfil, hotshot (que se basa en un gráfico de llamadas) y el uso de la función 'sys.setprofile' para atrapar eventos como c_ {llamada, devolución, excepción}, python_ {llamada, devolución, excepción}.
  • Ruby : Ruby también usa una interfaz similar a Python para crear perfiles. El perfilador plano en profile.rb, module y ruby-prof a C-extensión están presentes.

Perfiladores estadísticos

Algunos perfiladores operan por muestreo . Un generador de perfiles de muestreo sondea la pila de llamadas del programa de destino a intervalos regulares utilizando interrupciones del sistema operativo . Los perfiles de muestreo suelen ser menos precisos y específicos numéricamente, pero permiten que el programa de destino se ejecute casi a la máxima velocidad.

Los datos resultantes no son exactos, sino una aproximación estadística. "La cantidad real de error suele ser más de un período de muestreo. De hecho, si un valor es n veces el período de muestreo, el error esperado es la raíz cuadrada de n períodos de muestreo".

En la práctica, los perfiladores de muestreo a menudo pueden proporcionar una imagen más precisa de la ejecución del programa de destino que otros enfoques, ya que no son tan intrusivos para el programa de destino y, por lo tanto, no tienen tantos efectos secundarios (como en la memoria caché o en la instrucción decodificación de tuberías). Además, dado que no afectan tanto a la velocidad de ejecución, pueden detectar problemas que de otro modo estarían ocultos. También son relativamente inmunes a la sobreevaluación del costo de las rutinas pequeñas, comúnmente llamadas rutinas o ciclos "ajustados". Pueden mostrar la cantidad relativa de tiempo empleado en el modo de usuario frente al modo de kernel interrumpible, como el procesamiento de llamadas al sistema .

Aún así, el código del kernel para manejar las interrupciones implica una pérdida menor de ciclos de CPU, uso de caché desviado y no puede distinguir las diversas tareas que ocurren en el código del kernel ininterrumpido (actividad de rango de microsegundos).

El hardware dedicado puede ir más allá: ARM Cortex-M3 y algunos procesadores MIPS recientes La interfaz JTAG tiene un registro PCSAMPLE, que muestra el contador del programa de una manera realmente indetectable, lo que permite la recopilación no intrusiva de un perfil plano.

Algunos perfiladores estadísticos utilizados comúnmente para Java / código administrado son SmartBear Software 's AQtime y Microsoft ' s CLR Profiler . Esos perfiladores también soportan perfiles de código nativo, junto con Apple Inc. 's tiburón (OSX), Oprofile (Linux), Intel VTune y paralela amplificador (parte de Intel Parallel Studio ), y Oracle Performance Analyzer , entre otros.

Instrumentación

Esta técnica agrega efectivamente instrucciones al programa de destino para recopilar la información requerida. Tenga en cuenta que la instrumentación de un programa puede provocar cambios en el rendimiento y, en algunos casos, puede dar lugar a resultados inexactos y / o errores . El efecto dependerá de la información que se recopile, del nivel de detalles de sincronización informados y de si se utiliza el perfil de bloque básico junto con la instrumentación. Por ejemplo, agregar código para contar cada procedimiento / llamada de rutina probablemente tendrá menos efecto que contar cuántas veces se obedece cada declaración. Algunas computadoras tienen hardware especial para recopilar información; en este caso, el impacto en el programa es mínimo.

La instrumentación es clave para determinar el nivel de control y la cantidad de tiempo de resolución disponible para los perfiladores.

  • Manual : Lo realiza el programador, por ejemplo, agregando instrucciones para calcular explícitamente los tiempos de ejecución, simplemente contar eventos o llamadas a API de medición , como el estándar Application Response Measurement .
  • Nivel de fuente automático : instrumentación agregada al código fuente por una herramienta automática de acuerdo con una política de instrumentación.
  • Lenguaje intermedio : instrumentación agregada a códigos de bytes ensamblados o descompilados que brindan soporte para múltiples lenguajes fuente de nivel superior y evitan problemas de reescritura de compensación binaria (no simbólicos).
  • Compilador asistido
  • Traducción binaria : la herramienta agrega instrumentación a un ejecutable compilado .
  • Instrumentación en tiempo de ejecución : directamente antes de la ejecución, se instrumenta el código. La ejecución del programa está totalmente supervisada y controlada por la herramienta.
  • Inyección en tiempo de ejecución : más ligero que la instrumentación en tiempo de ejecución. El código se modifica en tiempo de ejecución para tener saltos a funciones auxiliares.

Instrumentación de intérprete

  • Las opciones de depuración del intérprete pueden permitir la recopilación de métricas de rendimiento a medida que el intérprete encuentra cada declaración de destino. Un código de bytes , una tabla de control o intérpretes JIT son tres ejemplos que generalmente tienen un control completo sobre la ejecución del código de destino, lo que permite oportunidades de recopilación de datos extremadamente completas.

Hipervisor / Simulador

  • Hipervisor : los datos se recopilan ejecutando el programa (generalmente) sin modificar bajo un hipervisor . Ejemplo: SIMMON
  • Simulador e hipervisor : datos recopilados de forma interactiva y selectiva mediante la ejecución del programa sin modificar en un simulador de conjunto de instrucciones .

Ver también

Referencias

enlaces externos