En ingeniería de software , la elaboración de perfiles ("elaboración de perfiles de programas", "elaboración de perfiles de software") es una forma de análisis dinámico de programas que mide, por ejemplo, la complejidad espacial (de memoria) o temporal de un programa , el uso de instrucciones específicas o la frecuencia y duración de las llamadas a funciones. Por lo general, la información de elaboración de perfiles sirve para ayudar a la optimización de programas y, más específicamente, a la ingeniería de rendimiento .
La creación de perfiles se logra instrumentando el código fuente del programa o su formato binario ejecutable mediante una herramienta llamada perfilador (o perfilador de código ). Los perfiladores pueden utilizar distintas técnicas, como métodos basados en eventos, estadísticos, instrumentados y de simulación.
Los perfiladores utilizan una amplia variedad de técnicas para recopilar datos, incluidas interrupciones de hardware , instrumentación de código , simulación de conjuntos de instrucciones , ganchos del sistema operativo y contadores de rendimiento .
Las herramientas de análisis de programas son extremadamente importantes para comprender el comportamiento de los programas. Los arquitectos informáticos necesitan estas herramientas para evaluar el rendimiento de los programas en nuevas arquitecturas . Los programadores de software necesitan herramientas para analizar sus programas e identificar secciones críticas del código. Los programadores de compiladores suelen utilizar estas herramientas para averiguar el rendimiento de su algoritmo de predicción de bifurcaciones o programación de instrucciones ...
— ÁTOMO, PLDI
La salida de un generador de perfiles puede ser:
/* ------------ fuente------------------------- recuento */ 0001 SI X = "A" 00550002 ENTONCES HAZLO 0003 AGREGAR 1 a XCOUNT 00320004 DEMÁS0005 SI X = "B" 0055
Un perfilador se puede aplicar a un método individual o a escala de un módulo o programa, para identificar cuellos de botella en el rendimiento haciendo obvio el código de larga ejecución. [1] Un perfilador se puede utilizar para comprender el código desde un punto de vista temporal, con el objetivo de optimizarlo para manejar varias condiciones de tiempo de ejecución [2] o varias cargas. [3] Los resultados del perfilado pueden ser ingeridos por un compilador que proporciona una optimización guiada por perfiles . [4] Los resultados del perfilado se pueden utilizar para guiar el diseño y la optimización de un algoritmo individual; el algoritmo de comodines coincidentes de Krauss es un ejemplo. [5] Los perfiladores están integrados en algunos sistemas de gestión del rendimiento de aplicaciones que agregan datos de perfilado para proporcionar información sobre las cargas de trabajo de transacciones en aplicaciones distribuidas . [6]
Las herramientas de análisis de rendimiento existían en las plataformas IBM/360 e IBM/370 desde principios de los años 1970, generalmente basadas en interrupciones de temporizador que registraban la palabra de estado del programa (PSW) en intervalos de temporizador establecidos para detectar "puntos calientes" en el código en ejecución. [ cita requerida ] Este fue un ejemplo temprano de muestreo (ver más abajo). A principios de 1974, los simuladores de conjuntos de instrucciones permitieron el seguimiento completo y otras funciones de monitoreo de rendimiento. [ cita requerida ]
El análisis de programas basado en perfiles en Unix se remonta a 1973, [7] 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 utilizaba. En 1982 gprof
se amplió el concepto a un análisis completo del gráfico de llamadas . [8]
En 1994, Amitabh Srivastava y Alan Eustace de Digital Equipment Corporation publicaron un artículo que describe ATOM [9] (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 código en el programa que se va a analizar. Ese código insertado genera datos de análisis. Esta técnica (modificar un programa para que se analice a sí mismo) se conoce como " instrumentación ".
En 2004, tanto el artículo de ATOM como el de la revista Theory and Practice aparecieron en la lista de los 50 artículos PLDIgprof
más influyentes para el período de 20 años que finalizó en 1999. [10]
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.
Los perfiles de grafos de llamadas [8] muestran los tiempos de llamada y las frecuencias de las funciones, así como las cadenas de llamadas involucradas en función del receptor de la llamada. En algunas herramientas, no se conserva el contexto completo.
Los perfiladores sensibles a la entrada [11] [12] [13] 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.
Los perfiladores, que también son programas en sí mismos, analizan los programas de destino mediante la recopilación de información sobre su ejecución. En función de la granularidad de los datos, es decir, de cómo recopilan información, se clasifican en perfiladores basados en eventos o estadísticos. Los perfiladores interrumpen la ejecución del programa para recopilar información, lo que puede dar lugar a una resolución limitada en las mediciones de tiempo, lo que debe tomarse con cautela. Los perfiladores de bloques básicos informan de una cantidad de ciclos de reloj de máquina dedicados a ejecutar cada línea de código, o de un tiempo basado en la suma de estos; los tiempos informados por bloque básico pueden no reflejar una diferencia entre los aciertos y los errores de la caché . [14] [15]
Los lenguajes de programación enumerados aquí tienen perfiladores basados en eventos:
Algunos perfiles funcionan mediante muestreo . Un perfilador 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 toda velocidad.
Los datos resultantes no son exactos, sino una aproximación estadística. “La cantidad real de error suele ser mayor que un período de muestreo. De hecho, si un valor es n veces el período de muestreo, el error esperado en él es la raíz cuadrada de n períodos de muestreo”. [16]
En la práctica, los generadores de perfiles de muestreo pueden proporcionar a menudo 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 las memorias caché o en los canales de decodificación de instrucciones). Además, dado que no afectan tanto a la velocidad de ejecución, pueden detectar problemas que de otro modo quedarían ocultos. También son relativamente inmunes a la sobreevaluación del costo de rutinas pequeñas y frecuentemente llamadas o bucles "ajustados". Pueden mostrar la cantidad relativa de tiempo empleado en el modo de usuario frente al modo de núcleo interrumpible, como el procesamiento de llamadas del sistema .
Aun así, el código del kernel para manejar las interrupciones implica una pérdida menor de ciclos de CPU, un uso de caché desviado y es incapaz de distinguir las distintas tareas que ocurren en el código del kernel ininterrumpible (actividad de rango de microsegundos).
El hardware dedicado puede ir más allá de esto: ARM Cortex-M3 y algunos procesadores MIPS recientes tienen una interfaz JTAG que tiene un registro PCAMPLE, que muestrea el contador del programa de una manera verdaderamente indetectable, lo que permite la recopilación no intrusiva de un perfil plano.
Algunos de los perfiladores estadísticos más utilizados [17] para código Java/administrado son AQtime [18] de SmartBear Software y CLR Profiler de Microsoft . [19] Estos perfiladores también admiten el perfilado de código nativo, junto con Shark (OSX) de Apple Inc. , [20] OProfile (Linux), [21] Intel VTune y Parallel Amplifier (parte de Intel Parallel Studio ) y Oracle Performance Analyzer , [22] entre otros.
Esta técnica añade instrucciones al programa de destino para recopilar la información necesaria. 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 o errores de Heisen . El efecto dependerá de qué información se esté recopilando, del nivel de detalles de tiempo informados y de si se utiliza el perfilado de bloques básico junto con la instrumentación. [23] Por ejemplo, añadir código para contar cada llamada a un procedimiento o una rutina probablemente tendrá menos efecto que contar cuántas veces se obedece cada instrucció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 resolución temporal disponible para los perfiladores.