Elaboración de perfiles (programación informática)

Medir el tiempo o los recursos utilizados por una sección de un programa informático

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.

Eventos del programa de reuniones

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 .

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 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:

  • Un resumen estadístico de los eventos observados (un perfil )
La información del perfil resumido a menudo se muestra anotada junto a las declaraciones del código fuente donde ocurren los eventos, por lo que el tamaño de los datos de medición es lineal al tamaño del código del programa.
/* ------------ fuente------------------------- recuento */ 0001 SI X = "A" 00550002 ENTONCES HAZLO 0003 AGREGAR 1 a XCOUNT 00320004 DEMÁS0005 SI X = "B" 0055
  • Un flujo de eventos registrados (un rastro )
Para los 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 rastro (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 rastro puede iniciarse en un punto de un programa y finalizarse 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 métricas en curso sobre el programa (que aún se está ejecutando). 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 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]

Historia

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 gprofse 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]

Tipos de perfiladores según 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.

Perfilador de gráficos de llamadas

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.

Perfilador sensible a la entrada

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.

Granularidad de datos en los tipos de perfiladores

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]

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 ganchos a los perfiladores para atrapar eventos como llamadas, carga de clase, descarga, entrada y salida de subprocesos.
  • .NET : puede adjuntar un agente de creación de perfiles como un servidor COM al CLR mediante la API de creación de perfiles . Al igual que Java, el entorno de ejecución proporciona varias devoluciones de llamadas al agente para capturar eventos como el método JIT /entrar/salir, la creación de objetos, etc. Es particularmente potente porque el agente de creación de perfiles puede reescribir 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 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_{call,return,exception}, python_{call,return,exception}.
  • Ruby : Ruby también utiliza una interfaz similar a Python para la creación de perfiles. Flat-profiler está presente en profile.rb, module y ruby-prof, una extensión de C.

Perfiladores estadísticos

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.

Instrumentación

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, agregar código para contar cada llamada a un procedimiento o 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.

  • Manual : realizado por el programador, por ejemplo, agregando instrucciones para calcular explícitamente tiempos de ejecución, simplemente contar eventos o llamadas a API de medición como el estándar de medición de respuesta de aplicación .
  • 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 al ensamblaje o códigos de bytes descompilados que brindan soporte para múltiples lenguajes fuente de nivel superior y evitan problemas de reescritura de desplazamiento binario (no simbólico).
  • Compilador asistido
  • Traducción binaria : La herramienta agrega instrumentación a un ejecutable compilado .
  • Instrumentación en tiempo de ejecución : el código se instrumenta directamente antes de su ejecución. La ejecución del programa está totalmente supervisada y controlada por la herramienta.
  • Inyección en tiempo de ejecución : más liviana 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 interpretación

  • 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 instrucción de destino. Un código de bytes , una tabla de control o los intérpretes JIT son tres ejemplos que suelen tener un control total 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 (normalmente) sin modificar en un hipervisor . Ejemplo: SIMMON
  • Simulador e Hipervisor : Datos recopilados de forma interactiva y selectiva ejecutando el programa sin modificar bajo un simulador de conjunto de instrucciones .

Véase también

Referencias

  1. ^ "¿Cómo encontrar el cuello de botella de rendimiento en una aplicación de escritorio C#?". Stack Overflow . 2012.
  2. ^ Krauss, Kirk J (2017). "Perfiles de desempeño con un enfoque". Desarrollar para el desempeño.
  3. ^ "¿Qué es el perfilado de código? Conozca los 3 tipos de perfiladores de código". Consejos, trucos y recursos para desarrolladores de Stackify . Disqus. 2016.
  4. ^ Lawrence, Eric (2016). "Introducción a la optimización guiada por perfiles". testslashplain . WordPress.
  5. ^ Krauss, Kirk (2018). "Coincidencia de comodines: un algoritmo mejorado para big data". Desarrollo para el rendimiento.
  6. ^ "Lista de generadores de perfiles .Net: 3 tipos diferentes y por qué los necesitas todos". Consejos, trucos y recursos para desarrolladores de Stackify . Disqus. 2016.
  7. ^ Manual del programador de Unix, cuarta edición
  8. ^ ab SL Graham, PB Kessler y MK McKusick, gprof: un generador de perfiles de ejecución de gráficos de llamadas, Actas del simposio SIGPLAN '82 sobre construcción de compiladores, SIGPLAN Notices , vol. 17, n.º 6, págs. 120-126; doi:10.1145/800230.806987
  9. ^ A. Srivastava y A. Eustace, ATOM: Un sistema para construir herramientas de análisis de programas personalizados, 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 de inicio de ACM SIGPLAN Notices - Best of PLDI 1979-1999, vol. 39, n.º 4, págs. 528-539; doi:10.1145/989393.989446
  10. ^ 20 años de PLDI (1979–1999): una selección, Kathryn S. McKinley , editora
  11. ^ 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
  12. ^ D. Zaparanuks y M. Hauswirth, Perfiles algorítmicos , 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
  13. ^ T. Kustner, J. Weidendorfer y T. Weinzierl, Argument Controlled Profiling , Actas de Euro-Par 2009 – Talleres de procesamiento paralelo, Notas de clase en informática, vol. 6043, págs. 177-184, 2010; doi:10.1007/978-3-642-14122-5 22
  14. ^ "Sincronización y creación de perfiles: perfiladores de bloques básicos". Archivo OpenStax CNX .
  15. ^ Ball, Thomas; Larus, James R. (1994). "Optimally profiling and tracing programs" (PDF) . ACM Transactions on Programming Languages ​​and Systems . 16 (4). Biblioteca digital ACM: 1319–1360. doi :10.1145/183432.183527. S2CID  6897138. Archivado desde el original (PDF) el 2018-05-18 . Consultado el 2018-05-18 .
  16. ^ Inexactitud estadística de la salida de gprof Archivado el 29 de mayo de 2012 en Wayback Machine
  17. ^ "Perfiladores de C# populares". Gingtage. 2014.
  18. ^ "Perfilador de muestreo: descripción general". Referencia de AQTime 8 . Software Smart Bear. 2018.
  19. ^ Wenzal, Maira; et al. (2017). "Descripción general de la creación de perfiles". Referencia de API no administrada de Microsoft .NET Framework . Microsoft.
  20. ^ "Herramientas de rendimiento". Herramientas para desarrolladores de Apple . Apple, Inc. 2013.
  21. ^ Netto, Zanella; Arnold, Ryan S. (2012). "Evaluar el rendimiento de Linux en Power". IBM DeveloperWorks .
  22. ^ Schmidl, Dirk; Terboven, Christian; an Mey, Dieter; Müller, Matthias S. (2013). Idoneidad de herramientas de rendimiento para programas paralelos de tareas OpenMP. Proc. 7.º taller internacional sobre herramientas paralelas para computación de alto rendimiento. págs. 25–37. ISBN 9783319081441.
  23. ^ Carleton, Gary; Kirkegaard, Knud; Sehr, David (1998). "Optimizaciones guiadas por perfiles". Diario del Dr. Dobb .
  • Artículo "Necesidad de velocidad: eliminación de cuellos de botella en el rendimiento" sobre cómo realizar análisis del tiempo de ejecución de aplicaciones Java utilizando IBM Rational Application Developer.
  • Creación de perfiles de código generado e interpretado en tiempo de ejecución mediante el analizador de rendimiento de VTune
Retrieved from "https://en.wikipedia.org/w/index.php?title=Profiling_(computer_programming)&oldid=1244434414"