En ingeniería de software , el perfilado ( perfilado de programas , perfilado de software ) es una forma de análisis dinámico de programas que mide, por ejemplo, la complejidad espacial (memoria) o temporal de un programa , el uso de instrucciones específicas o la frecuencia y duración de las llamadas a funciones. Generalmente, la información de perfilado sirve para optimizar el programa y, más específicamente, para mejorar su rendimiento .
La creación de perfiles se logra instrumentando el código fuente del programa o su versión ejecutable binaria mediante una herramienta denominada perfilador (o analizador de código ). Los perfiladores pueden utilizar diversas técnicas, como métodos basados en eventos, estadísticos, instrumentados y de simulación.
Eventos del programa de encuentro
Los analizadores de rendimiento 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 .
Uso de perfiles

Las herramientas de análisis de programas son fundamentales para comprender su comportamiento. Los arquitectos informáticos las necesitan para evaluar el rendimiento de los programas en nuevas arquitecturas . Los programadores necesitan herramientas para analizar sus programas e identificar secciones críticas del código. Los desarrolladores de compiladores suelen utilizarlas para comprobar el rendimiento de sus algoritmos de planificación de instrucciones o de predicción de bifurcaciones .
— ÁTOMO, PLDI
La salida de un analizador de perfiles puede ser:
- Un resumen estadístico de los eventos observados (un perfil )
- La información resumida del perfil suele mostrarse anotada junto a las instrucciones del código fuente donde ocurren los eventos, por lo que el tamaño de los datos de medición es lineal con respecto al tamaño del código del programa.
/* ------------ origen------------------------- recuento */ 0001 SI X = "A" 0055 0002 ENTONCES HACER 0003 AÑADIR 1 a XCOUNT 0032 0004 OTRO 0005 SI X = "B" 0055
- Una secuencia de eventos registrados (un rastro )
- En el caso de programas secuenciales, un perfil resumido suele ser suficiente, pero los problemas de rendimiento en programas paralelos (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 un rastreo (completo) es lineal con respecto a la longitud de la ruta de instrucciones del programa , lo que lo hace poco práctico. Por lo tanto, un rastreo puede iniciarse en un punto del programa y finalizarse en otro para limitar la salida.
- Una interacción continua con el hipervisor (por ejemplo, monitorización continua o periódica mediante visualización en pantalla).
- Esto permite activar o desactivar el seguimiento en cualquier momento de la ejecución, además de visualizar métricas en tiempo real sobre el programa (que aún se está ejecutando). También permite suspender los procesos asíncronos en puntos críticos para examinar con mayor detalle las interacciones con otros procesos paralelos.
Un perfilador puede aplicarse a un método individual o a la escala de un módulo o programa, para identificar cuellos de botella de rendimiento al hacer evidente el código de larga duración. [ 1 ] Un perfilador puede usarse para comprender el código desde un punto de vista temporal, con el objetivo de optimizarlo para manejar diversas condiciones de tiempo de ejecución [ 2 ] o diversas cargas. [ 3 ] Los resultados del perfilado pueden ser ingeridos por un compilador que proporciona optimización guiada por perfilado . [ 4 ] Los resultados del perfilado pueden usarse para guiar el diseño y la optimización de un algoritmo individual; el algoritmo de coincidencia de comodines 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 ]
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 predefinidos para detectar puntos críticos en la ejecución del código. Este fue un ejemplo temprano de muestreo (véase más abajo). A principios de 1974, los simuladores de conjuntos de instrucciones permitieron el rastreo completo y otras funciones de monitorización del rendimiento.
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 listaba cada función y cuánto tiempo de ejecución del programa utilizaba. En 1982 gprofse extendió el concepto a un análisis completo del grafo de llamadas . [ 8 ]
En 1994, Amitabh Srivastava y Alan Eustace, de Digital Equipment Corporation, publicaron un artículo que describía ATOM [ 9 ] (Analysis Tools with OM). La plataforma ATOM convierte un programa en su propio perfilador: durante la compilación , inserta código en el programa que se va a analizar. Este 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 gprofartículo como el artículo ATOM aparecieron en la lista de los 50 artículos más influyentes de PLDI para el período de 20 años que finalizó en 1999. [ 10 ]
Tipos de perfiladores según la salida
Perfilador plano
Los analizadores de perfiles planos calculan los tiempos promedio de las llamadas, a partir de las llamadas, y no desglosan los tiempos de las llamadas en función del destinatario o el contexto. [ 11 ]
Perfilador de gráficos de llamadas
Los analizadores de gráficos de llamadas [ 8 ] muestran los tiempos de llamada y las frecuencias de las funciones, así como las cadenas de llamadas involucradas según la función llamada. En algunas herramientas no se conserva el contexto completo .
Perfilador sensible a la entrada
Los analizadores de rendimiento sensibles a la entrada [ 12 ] [ 13 ] [ 14 ] añaden una dimensión adicional a los analizadores de rendimiento planos o basados en gráficos de llamadas, al relacionar las métricas de rendimiento con las características de las cargas de trabajo de entrada, como el tamaño o los valores de entrada. Generan gráficos que caracterizan cómo varía el rendimiento de una aplicación en función de su entrada.
Granularidad de los datos en los tipos de perfiladores
Los analizadores de rendimiento, que también son programas en sí mismos, analizan los programas objetivo recopilando información sobre su ejecución. Según la granularidad de sus datos, que depende de cómo los analizadores recopilan la información, se clasifican como analizadores basados en eventos o estadísticos . Los analizadores interrumpen la ejecución del programa para recopilar información. Estas interrupciones pueden limitar la resolución de la medición del tiempo, lo que implica que los resultados de temporización deben tomarse con precaución. Los analizadores de rendimiento de bloques básicos informan la cantidad de ciclos de reloj de máquina dedicados a ejecutar cada línea de código, o bien, la temporización basada en la suma de estos; los tiempos informados por bloque básico pueden no reflejar la diferencia entre aciertos y fallos de caché . [ 15 ] [ 16 ]
Perfiladores basados en eventos
Existen analizadores de rendimiento basados en eventos para los siguientes lenguajes de programación:
- Java : la API JVMTI (JVM Tools Interface), anteriormente JVMPI (JVM Profiling Interface), proporciona puntos de acceso a los analizadores de rendimiento para capturar eventos como llamadas, carga y descarga de clases, y entrada y salida de hilos.
- .NET : Permite conectar un agente de perfilado como servidor COM al CLR mediante la API de perfilado . Al igual que en Java, el entorno de ejecución proporciona diversas funciones de devolución de llamada al agente para capturar eventos como la entrada/salida de métodos JIT , la creación de objetos, etc. Resulta especialmente potente, ya que el agente de perfilado puede modificar el código de bytes de la aplicación de destino de forma arbitraria.
- Python : La creación de perfiles de Python incluye el módulo profile, hotshot (que se basa en el gráfico de llamadas) y el uso de la función 'sys.setprofile' para capturar eventos como c_{call,return,exception}, python_{call,return,exception}.
- Ruby : Ruby también utiliza una interfaz similar a la de Python para la creación de perfiles. Se encuentran presentes Flat-profiler en profile.rb, el módulo y ruby-prof, una extensión de C.
Perfiladores estadísticos
Estos analizadores de rendimiento funcionan mediante muestreo . Un analizador de rendimiento por muestreo examina la pila de llamadas del programa objetivo a intervalos regulares utilizando interrupciones del sistema operativo . Los perfiles de muestreo suelen ser menos precisos y específicos numéricamente, proporcionando solo una aproximación estadística, pero permiten que el programa objetivo se ejecute casi a máxima velocidad. "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 es la raíz cuadrada de n períodos de muestreo." [ 17 ]
En la práctica, los analizadores de rendimiento basados en muestreo suelen proporcionar una imagen más precisa de la ejecución del programa objetivo que otros enfoques, ya que no son tan intrusivos y, por lo tanto, no tienen tantos efectos secundarios (como en las cachés de memoria o las canalizaciones de decodificación de instrucciones). Además, como no generan mucha sobrecarga, pueden detectar problemas que de otro modo pasarían desapercibidos. [ 18 ] También son relativamente inmunes a sobreestimar el costo de rutinas pequeñas y frecuentes o bucles "ajustados". Pueden mostrar la cantidad relativa de tiempo invertido en modo usuario frente al modo kernel interrumpible, como el procesamiento de llamadas al sistema .
Desafortunadamente, ejecutar código del kernel para gestionar las interrupciones conlleva una pequeña pérdida de ciclos de CPU del programa objetivo, desvía el uso de la caché y no permite distinguir las distintas tareas que se producen en el código del kernel ininterrumpible (actividad en el rango de microsegundos) del código del usuario. El hardware dedicado ofrece mejores resultados: las interfaces JTAG de los procesadores ARM Cortex-M3 y algunos procesadores MIPS recientes disponen de un registro PCSAMPLE, que muestrea el contador de programa de forma totalmente imperceptible, lo que permite la recopilación no intrusiva de un perfil plano.
Algunos perfiles estadísticos comúnmente utilizados [ 19 ] para Java/código administrado son AQtime de SmartBear Software [ 20 ] y CLR Profiler de Microsoft . [ 21 ] Estos perfiles también admiten el perfilado de código nativo, junto con Shark de Apple Inc. (OSX), [ 22 ] OProfile (Linux), [ 23 ] Intel VTune y Parallel Amplifier (parte de Intel Parallel Studio ), y Oracle Performance Analyzer , [ 24 ] entre otros.
Instrumentación
Esta técnica añade instrucciones al programa objetivo para recopilar la información necesaria. Cabe señalar que la instrumentación de un programa puede provocar cambios en el rendimiento y, en algunos casos, resultados inexactos o errores de ejecución . El efecto dependerá de la información recopilada, del nivel de detalle temporal y de si se utiliza el perfilado básico de bloques junto con la instrumentación. [ 25 ] Por ejemplo, añadir código para contar cada llamada a procedimiento/rutina probablemente tendrá menos efecto que contar cuántas veces se cumple cada instrucción. Algunos ordenadores disponen de 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 resolución temporal disponibles para los analistas de perfiles.
- Manual : Realizado por el programador, por ejemplo, agregando instrucciones para calcular explícitamente los tiempos de ejecución, simplemente contar eventos o realizar llamadas a API de medición como el estándar Application Response Measurement .
- Nivel de fuente automático : instrumentación añadida al código fuente por una herramienta automática de acuerdo con una política de instrumentación.
- Lenguaje intermedio : instrumentación añadida al código ensamblador o a los bytecodes descompilados que proporciona soporte para múltiples lenguajes fuente de nivel superior y evita problemas de reescritura de desplazamiento binario (no simbólico).
- Compilador asistido
- Traducción binaria : La herramienta añade instrumentación a un ejecutable compilado .
- Instrumentación en tiempo de ejecución : El código se instrumenta justo antes de su ejecución. La herramienta supervisa y controla completamente la ejecución del programa.
- Inyección en tiempo de ejecución : Más ligera que la instrumentación en tiempo de ejecución. El código se modifica en tiempo de ejecución para incluir saltos a funciones auxiliares.
Instrumentación del intérprete
- Las opciones de depuración del intérprete permiten recopilar métricas de rendimiento a medida que el intérprete encuentra cada instrucción objetivo. Los intérpretes de bytecode , de tabla de control o JIT son tres ejemplos que suelen tener control total sobre la ejecución del código objetivo, lo que permite recopilar datos de forma exhaustiva.
Hipervisor/simulador
- Hipervisor : Los datos se recopilan ejecutando el programa (generalmente) sin modificar bajo un hipervisor . Ejemplo: SIMMON
- Simulador e hipervisor : Los datos se recopilan de forma interactiva y selectiva ejecutando el programa sin modificar bajo un simulador de conjunto de instrucciones .
Véase también
- Eficiencia algorítmica
- Evaluación comparativa : evaluación estandarizada del desempeño
- Rendimiento de Java : un aspecto del lenguaje de programación Java.
- Lista de herramientas de análisis de rendimiento
- PAPI – Biblioteca de software para métricas de microprocesadores
- Ingeniería de rendimiento : abarca las técnicas aplicadas durante el ciclo de vida del desarrollo de sistemas.
- Predicción del rendimiento
- Ajuste del rendimiento
- Verificación en tiempo de ejecución : Extracción de información de un sistema en funcionamiento para verificar ciertas propiedades.
- Optimización guiada por perfiles : técnica de optimización de compiladores
- Análisis de código estático : análisis de programas informáticos sin ejecutarlos. Páginas que muestran breves descripciones de destinos de redireccionamiento.
- Arqueología del software : estudio de las implementaciones de software heredado.
- Tiempo de ejecución en el peor de los casos : duración máxima que podría tardar en ejecutarse una tarea computacional (WCET).
Referencias
- ↑ "¿Cómo encontrar el cuello de botella de rendimiento en una aplicación de escritorio C#?" . Stack Overflow . 2012.
- ↑ Krauss, Kirk J (2017). "Perfilado de rendimiento con un enfoque" . Desarrollar para el rendimiento.
- ↑ "¿Qué es el análisis de rendimiento del código? Descubre los 3 tipos de analizadores de rendimiento del código" . Consejos, trucos y recursos para desarrolladores de Stackify . Disqus. 2016.
- ↑ Lawrence, Eric (2016). "Primeros pasos con la optimización guiada por perfiles" . testslashplain . WordPress.
- ↑ Krauss, Kirk (2018). "Matching Wildcards: An Improved Algorithm for Big Data" . Develop for Performance.
- ↑ "Lista de herramientas de análisis de rendimiento .Net: 3 tipos diferentes y por qué las necesitas todas" . Consejos, trucos y recursos para desarrolladores de Stackify . Disqus. 2016.
- ↑ Manual del programador de Unix, 4.ª edición
- 1 2 SL Graham, PB Kessler y MK McKusick, gprof: un perfilador de ejecución de grafos de llamadas , Actas del Simposio SIGPLAN '82 sobre Construcción de Compiladores, SIGPLAN Notices , Vol. 17, No 6, pp. 120-126; doi:10.1145/800230.806987
- ↑ A. Srivastava y A. Eustace, ATOM: Un sistema para construir herramientas de análisis de programas personalizadas , Actas de la Conferencia ACM SIGPLAN sobre diseño e implementación de lenguajes de programación (PLDI '94), págs. 196-205, 1994; Archivo de la página principal de ACM SIGPLAN Notices - Best of PLDI 1979-1999, vol. 39, n.º 4, págs. 528-539; doi:10.1145/989393.989446
- ↑ 20 años de PLDI (1979–1999): Una selección , Kathryn S. McKinley , editora
- ↑ Maplesden, David; Tempero, Ewan; Hosking, John; Grundy, John (2015). "Análisis de rendimiento para software orientado a objetos: un mapeo sistemático" . IEEE Transactions on Software Engineering : 1–1 . doi : 10.1109/tse.2015.2396514 .
- ^ E. Coppa, C. Demetrescu e I. Finocchi, Perfiles sensibles a la entrada , IEEE Trans. Ing. de Software. 40(12): 1185-1205 (2014); doi:10.1109/TSE.2014.2339825
- ↑ D. Zaparanuks y M. Hauswirth, Algorithmic Profiling , Actas de la 33.ª Conferencia ACM SIGPLAN sobre Diseño e Implementación de Lenguajes de Programación (PLDI 2012), ACM SIGPLAN Notices, vol. 47, n.º 6, págs. 67-76, 2012; doi:10.1145/2254064.2254074
- ↑ T. Kustner, J. Weidendorfer y T. Weinzierl, Argument Controlled Profiling , Actas de Euro-Par 2009 – Talleres de Procesamiento Paralelo, Lecture Notes in Computer Science, Vol. 6043, pp. 177-184, 2010; doi:10.1007/978-3-642-14122-5 22
- ↑ "Sincronización y perfilado: perfiles de bloques básicos" . Archivo OpenStax CNX .
- ↑ Ball, Thomas; Larus, James R. (1994). "Optimally profiling and tracing programs" (PDF) . ACM Transactions on Programming Languages and Systems . 16 (4). ACM Digital Library: 1319–1360 . doi : 10.1145/183432.183527 . S2CID 6897138. Archivado del original (PDF) el 18 de mayo de 2018. Recuperado el 18 de mayo de 2018 .
- ↑ Inexactitud estadística de
gprofla salida Archivado el 29/05/2012 en Wayback Machine - ↑ Reichelt, David Georg; Skarbalius, Juozas (2026). "Benchmarking Change Detection Exactness and Overhead of Instrumentation and Sampling". Companion of the 17th ACM/SPEC International Conference on Performance Engineering . ICPE Companion '26. Nueva York, NY, EE. UU.: ACM. p. 8. doi : 10.1145/3777911.3800701 .
- ↑ "Perfiladores populares de C#" . Gingtage. 2014.
- ^ "Perfilador de muestreo: descripción general" . Referencia de AQTime 8 . Software Smart Bear. 2018.
- ↑ Wenzal, Maira; et al. (2017). "Descripción general del perfilado" . Referencia de la API no administrada de Microsoft .NET Framework . Microsoft.
- ↑ "Herramientas de rendimiento" . Herramientas para desarrolladores de Apple . Apple, Inc. 2013.
- ↑ Netto, Zanella; Arnold, Ryan S. (2012). "Evaluar el rendimiento de Linux en Power" . IBM DeveloperWorks .
- ↑ Schmidl, Dirk; Terboven, Christian; an Mey, Dieter; Müller, Matthias S. (2013). Adecuación de las herramientas de rendimiento para programas de tareas paralelas OpenMP . Actas del 7.º Taller Internacional sobre Herramientas Paralelas para Computación de Alto Rendimiento. págs. 25–37 . ISBN 9783319081441.
- ^ Carleton, Gary; Kirkegaard, Knud; Sehr, David (1998). "Optimizaciones guiadas por perfiles" . Diario del Dr. Dobb .
Enlaces externos
- Artículo " Necesidad de velocidad : Eliminación de cuellos de botella de rendimiento " sobre el análisis del tiempo de ejecución de aplicaciones Java utilizando IBM Rational Application Developer .
- Análisis del rendimiento del código generado e interpretado en tiempo de ejecución mediante el analizador de rendimiento VTune.
- Optimización de software
- Perfiladores