En ingeniería de software el análisis de rendimiento, comúnmente llamado profiling o perfilaje, son herramientas de software utilizadas para analizar y medir el rendimiento de una aplicación o programa. Su objetivo principal es identificar los puntos críticos de la aplicación que consumen la mayor cantidad de tiempo de ejecución o recursos del sistema.

Los perfiladores pueden ayudar a los desarrolladores a identificar cuellos de botella, áreas de código ineficientes o subóptimas y ofrecer información detallada sobre el tiempo de ejecución y el uso de recursos, como la cantidad de tiempo de CPU utilizado, la memoria asignada y los eventos de E/S. Esto permite a los desarrolladores optimizar el rendimiento de sus aplicaciones al realizar cambios específicos en el código o en la configuración del sistema.

Existen diferentes tipos de perfiladores, como los perfiladores de CPU, que miden el tiempo de ejecución de cada función o método dentro de una aplicación y muestran la cantidad de tiempo que se consume en cada una. También hay perfiladores de memoria, que rastrean el uso de la memoria y pueden ayudar a identificar fugas de memoria o áreas donde se está utilizando una cantidad excesiva de memoria.

Usualmente el Profiling es utilizado durante el desarrollo de software como método para la depuración y optimización de los algoritmos, esta práctica vista de esta manera es buena, pero es vista más como una actividad interna que suele carecer de objetividad y veracidad cuando no es evaluado por personal realmente especializado y en el entorno adecuado para ello.Profiling. Estratecgias.

El profiling se puede llevar a cabo en el código fuente o sobre un binario ejecutable mediante una herramienta llamada profiler.

Los profilers pueden clasificarse según la forma de recopilación de datos que utilicen, pudiendo destacar: basados en eventos, estadísticos, con instrumentación de código y como simulación.Funcionalidad implementada por profilers.

Historia

Las herramientas de análisis de rendimiento ya existían en las plataformas IBM S/360 y IBM System/370 de principios de 1970. Generalmente se basaba en un temporizador de interrupciones que se registraban en el programa de palabra de estado (Program status word, PSW) (que era un contador de programa y un registro de estado a la vez en estas arquitecturas) en intervalos establecidos para detectar hot spots en la ejecución del código.Computerworld 19 de septiembre de 1977 Este fue un ejemplo temprano de muestreo en estadística que es un tipo que se verá a continuación. A principios de 1974, el simulador de conjunto de instrucciones permitió realizar trazas completas y otras funciones de supervisión del rendimiento.

Los programas analizadores de rendimiento en Unix se remontan al menos a 1979, cuando los sistemas Unix incluía la herramienta básica prof que aparece cada función y la cantidad de tiempo de ejecución del programa utilizado. En 1982, gprof extendió el concepto a un análisis llamado grafo de llamadas.gprof: a Call Graph Execution Profiler // Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126; doi:10.1145/800230.806987

En 1994, Amitabh Srivastava y Alan Eustace de Digital Equipment Corporation publican un artículo describiendo ATOM.Amitabh Srivastava and Alan Eustace, "Atom: A system for building customized program analysis tools", 1994 (download) // Proceeding PLDI '94 Proceedings of the ACM SIGPLAN 1994 conference on Programming language design and implementation. Pages 196 - 205, doi:10.1145/773473.178260 ATOM es una plataforma para convertir un programa en su propio profiler. Es decir, en tiempo de compilación, inserta el código en el programa a ser analizado. Ese código introducido produce salidas de datos de análisis. Esta técnica (modificar un programa para analizarse a sí mismo se conoce como instrumentación).

En 2004, tanto el "paper" de gprof como el de ATOM aparecieron en la lista de los 50 "papers" más influyentes de Programming Language Design and Implementation de todos los tiempos.20 Years of PLDI (1979–1999): A Selection, Kathryn S. McKinley, Editor

Los perfiladores, en el ámbito de la computación, tienen una larga historia de desarrollo y evolución que se remonta a las primeras etapas de la informática. A continuación, menciona los los hitos importantes en la historia de los perfiladores:

Años 1960: En esta época temprana de la computación, los sistemas eran limitados en recursos y capacidad de procesamiento. Los primeros perfiles de rendimiento se basaban principalmente en la observación y la intuición del programador para identificar áreas de código ineficientes. Años 1970: Con el crecimiento de la capacidad de procesamiento y la complejidad de los sistemas informáticos, surgieron las primeras herramientas de perfilado automatizadas. Estas herramientas permitían a los programadores realizar mediciones y análisis más precisos del rendimiento de sus programas. Años 1980: Con la aparición de lenguajes de programación más avanzados y sistemas operativos más sofisticados, los perfiladores comenzaron a proporcionar información más detallada, como el tiempo de ejecución de cada función o método. Años 1990: Con el auge de la programación orientada a objetos y la explosión de la web, los perfiladores se adaptaron para manejar sistemas más complejos y aplicaciones distribuidas. Surgieron herramientas más sofisticadas que permitían el análisis del rendimiento en entornos multiplataforma. Años 2000: Con el crecimiento exponencial de las aplicaciones web y móviles, los perfiladores se volvieron aún más importantes. Se desarrollaron herramientas específicas para optimizar el rendimiento en entornos web y móviles, lo que permitió a los desarrolladores analizar el rendimiento de sus aplicaciones en diferentes dispositivos y navegadores. Actualidad: En la actualidad, los perfiladores continúan evolucionando para satisfacer las necesidades de las aplicaciones modernas y los sistemas informáticos cada vez más complejos. Se han desarrollado herramientas avanzadas que pueden analizar el rendimiento en tiempo real, identificar cuellos de botella y sugerir mejoras automáticas para optimizar el rendimiento.

Los perfiladores han experimentado un desarrollo continuo a lo largo de la historia de la computación, adaptándose a medida que los sistemas y las aplicaciones se volvieron más complejos. Han pasado de depender de la intuición del programador a utilizar herramientas automatizadas y sofisticadas para medir y optimizar el rendimiento de las aplicaciones.

Perfilado de código

Métodos de perfilado: determinista y estadístico El perfilado de código puede realizarse principalmente mediante dos metodologías: determinista y estadística. El perfilado determinista registra cada llamada a funciones, cada evento y su duración exacta durante la ejecución del programa. Este enfoque proporciona mediciones precisas y permite identificar con detalle los cuellos de botella, aunque introduce una mayor sobrecarga computacional. Por otro lado, el perfilado estadístico toma muestras periódicas del estado del programa, recolectando información sobre qué funciones estaban activas en intervalos determinados. Este método tiene una sobrecarga reducida y es adecuado para analizar programas de larga duración o sistemas en producción, aunque ofrece una resolución temporal menor. Ambos enfoques son esenciales en la optimización del rendimiento, especialmente en sistemas de alto desempeño y aplicaciones científicas.

Recopilación de los eventos del programa

Los profilers utilizan una amplia variedad de técnicas para recopilar datos, incluyendo: interrupciones por hardware, instrumentación de código, simulador de conjunto de instrucciones, hooking y contadores de rendimiento de hardware. El profiling es la técnica más usada dentro de la ingeniería de rendimiento.

Aparte delo anterior, existen de igual manera herramientas para este fin, las herramientas de perfilado son herramientas de software que se utilizan para analizar y medir el rendimiento de una aplicación o sistema informático. Estas herramientas permiten a los desarrolladores identificar cuellos de botella en el código y mejorar el rendimiento de una aplicación. Algunas herramientas populares de perfilado incluyen:  Profiler de CPU: Herramienta que mide el tiempo que tarda una aplicación en realizar una determinada tarea y el uso de la CPU durante ese tiempo. Profiler de memoria: Herramienta que mide el uso de la memoria de una aplicación y detecta fugas de memoria. Profiler de E/S: Herramienta que mide el tiempo que tarda una aplicación en realizar operaciones de entrada y salida. Profiler de red: Herramienta que mide el tiempo que tarda una aplicación en enviar y recibir datos a través de una red. Profiler de rendimiento web: Herramienta que mide el tiempo de carga de una página web y detecta cuellos de botella en el código. Tipos de perfilaje Ya que el objetivo de la perfilación es obtener información puntual sobre los aspectos de ejercicio de un programa, ésta depende en gran medida de la estructura del mismo, y que se sigan buenas prácticas de programación para que la información obtenida a partir de estas recolecciones sea significativa. Estas recolecciones de datos pueden hacerse de forma manual o automática; dependiendo el tamaño del proyecto o la naturaleza de la información que será recolectada. Para ambos tipos de recolección hay métodos específicos que pueden ser implementados.

Perfilación Manual La recolección manual de datos implica la inclusión de instrucciones en el código que se encarguen de recolectar los datos en el código que nos permitan conocer su eficiencia. Esto puede hacerse usando funciones nativas del lenguaje, mediante el uso de bibliotecas especializadas o consultas a APIs. Este método puede resultar más efectivo cuando ya se ha identificado previamente un hotspot y ahora se busca extraer información más puntual sobre su comportamiento para identificar las áreas donde puede ser optimizado. Algunos métodos de perfilación manual son:

Marcadores de tiempo: Se colocan marcadores de tiempo al inicio y final de una sección de código, o llamada a función, para obtener el total de tiempo que toma su ejecución. Si dentro de esta función se hace uso de otras, esto afectará el tiempo de la misma; por lo que la interdependencia de funciones no optimizadas puede suponer un obstáculo para la medición efectiva. Contadores: A diferencia de los marcadores de tiempo, un contador es utilizado para registrar cuántas veces es llamada una función dentro de la ejecución de un programa, conocer esto puede ser un primer paso cuando se comienza a buscar hotspots; una función que es llamada constantemente puede ocasionar cuellos de botella si no se encuentra bien optimizada. En casos donde la sustitución del cuerpo de la función por su llamado es posible, el tiempo de ejecución puede ser disminuido. Registro de eventos: Guarda información sobre la ocurrencia de acciones específicas dentro de la ejecución de un programa, como la modificación de una variable o la llamada a una función. Conocer el contexto de la ocurrencia de un cambio puede ser de ayuda al determinar cómo este puede set mejorado; como en las estructuras if-else, donde la opción de mayor uso debería colocarse al inicio de la condicional, para evitar la mayor cantidad de comparaciones innecesarias.

Perfilación Automática. El perfilado automático hace uso de software especializado y herramientas nativas del sistema operativo, o compiladores, para recolectar datos sobre el rendimiento de un programa de forma automatizada; por lo que no es necesario hacer modificaciones manuales en el código para obtener las métricas usando estos métodos. Algunos de los métodos para los que son usados son:

Profiling profilers: Se ejecutan a la par del programa y almacenan información referente a la ejecución.