
La publicación presenta una implementación de software de herramientas integradas para recopilar y acumular información métrica sobre el tiempo de ejecución de las aplicaciones escritas en C / C ++ / C #.
La esencia del enfoque descrito se basa en la inclusión de "puntos de control" en el código del programa de la aplicación para extraer datos sobre el tiempo de ejecución de los componentes estructurales: métodos, funciones y bloques {}. La información métrica extraída se acumula en una base de datos interna, cuyo contenido al final de la aplicación se convierte en un formulario de informe de texto almacenado en un archivo. La conveniencia de utilizar los medios de control integrados del tiempo de ejecución se debe a la necesidad de identificar áreas problemáticas del código, analizar las causas de la degradación temporal de la aplicación: total o parcial, o manifestarse en ciertos conjuntos de datos de origen.
Los ejemplos de código fuente de C ++ / C # dados demuestran posibles implementaciones del enfoque descrito.
Introduccion
El desarrollo de una aplicación de software en cada iteración (por ejemplo, el lanzamiento de la próxima versión) de su desarrollo evolutivo incluye los siguientes pasos básicos:
- desarrollo y prueba de funcionalidad;
- optimización de recursos consumidos de RAM;
- estabilización de métricas de tiempo de ejecución.
Estos pasos requieren una cantidad significativa de desarrolladores no solo creativos (como el desarrollo e implementación de algoritmos efectivos, la construcción de una arquitectura de software flexible, etc.), sino también un trabajo de rutina. La última categoría incluye actividades destinadas a estabilizar las métricas de tiempo para la ejecución de la aplicación. En muchos casos, este es un procedimiento bastante doloroso, cuando los desarrolladores se enfrentan a la degradación, que es una consecuencia de la expansión de la funcionalidad de un producto de software, la reconstrucción de la arquitectura del software y la aparición de nuevos hilos en la aplicación. Al mismo tiempo, las fuentes de degradación requieren ciertos esfuerzos para detectarlas, lo que se logra no solo por la alta laboriosidad y responsabilidad de los desarrolladores (condición necesaria), sino también por la composición de las herramientas utilizadas para estos fines (condición suficiente).
Uno de los enfoques efectivos para resolver el problema de analizar las métricas de tiempo de aplicación es el uso de productos de software especializados, por ejemplo GNU
gprof . El análisis de los informes generados por tales herramientas le permite identificar "cuellos de botella" (métodos y funciones de clase), que representan una cantidad significativa de tiempo dedicado a ejecutar la aplicación como un todo. Al mismo tiempo, los desarrolladores califican la validez del tiempo dedicado a la ejecución de métodos y procedimientos.
También se debe tener en cuenta que los productos de software de esta clase, como regla, realizan análisis métricos del tiempo de ejecución del código del programa en los niveles de métodos de clases y funciones, ignorando los niveles más bajos (pero no obstante significativos desde el punto de vista del análisis del problema):
{...}, para, mientras que, do-until, if - else, try-catch blocks, dentro del cual ocurren gastos no menos significativos de tiempo de ejecución.
A continuación, se considera el contenido principal de una de las posibles soluciones para la implementación del control incorporado de las herramientas de tiempo de ejecución destinadas a extraer y acumular información detallada sobre las métricas de tiempo de los bloques de software controlados con la posterior generación de informes para desarrolladores.
Métodos para recuperar datos de tiempo de ejecución
La funcionalidad de cualquier aplicación de software puede interpretarse como una
máquina abstracta con un conjunto finito de
estados únicos
{St} y transiciones
{Tr} entre ellos.
En el marco de este enfoque, cualquier flujo de ejecución en la aplicación debe interpretarse como una secuencia ordenada de sus estados y transiciones entre ellos. En este caso, la estimación de los costos del tiempo de ejecución se realiza sumando las métricas de tiempo sobre todo el conjunto de estados pasados, ignorando los costos de las transiciones de un estado a otro, como valores insignificantes.
La extracción y acumulación de datos sobre el tiempo de ejecución de la aplicación en los puntos de control especificados es la tarea principal resuelta por las herramientas de control incorporadas que se describen a continuación.
Para cada punto de interrupción declarado en el código fuente colocando
PROFILE_ENTRY Macro C ++, se registra el número de pases durante la ejecución de la aplicación, así como la métrica de tiempo: el tiempo total que la aplicación estuvo en el estado desde el momento en que el punto de control pasó al siguiente nivel de la jerarquía del programa (incluido un bloque, método de clase, función, etc.) como se ilustra en el diagrama a continuación.
El control de los puntos de control (registro inicial y cálculo de sus métricas de tiempo) se realiza mediante el objeto
'timeManager' , que se crea en una sola instancia. Cada evento de pasar el punto de control es fijado por el objeto
'timeManager', y durante la primera pasada se registra como observable como
'registerEntry' .
En el momento de cada paso del punto de control, se crea un
timerObject , que fija el tiempo de su creación. El tiempo de ejecución se fija en el punto de control cuando la aplicación sale del nivel actual de la jerarquía de software. En este momento, el objeto de temporizador del objeto se destruye automáticamente, lo que se acompaña del cálculo de su "vida útil". Para todos los puntos de control establecidos,
timeManager acumula datos con la publicación posterior de un informe cuando finaliza la aplicación.

A continuación se muestra el código fuente de C ++ que implementa las herramientas integradas para controlar el tiempo de ejecución de la aplicación.
La estructura de la aplicación de demostración se ilustra a continuación, ilustrando el uso de las herramientas de control de tiempo de ejecución incorporadas como ejemplo, así como una tabla de los resultados obtenidos (para más detalles, consulte el
Apéndice 1. Código fuente de la aplicación de demostración ).

Anexo de sección
2. El código fuente de los medios del control incorporado del tiempo de ejecución de la aplicación C # presenta una implementación similar de los medios del control incorporado en C #.
El autor utiliza pares de
TimeWatcher.StartWatch () y
TimeWatcher.StopWatch () al perfilar el tiempo de ejecución de métodos y procedimientos laboriosos (desde un punto de vista computacional) como parte del producto de software
Delta Design desarrollado por
EREMEX , un sistema de diseño asistido por computadora para equipos electrónicos.
A continuación se muestra un ejemplo de un breve informe sobre las métricas de tiempo de una de las funciones del producto mencionado.
Breves conclusiones
Las herramientas descritas se pueden utilizar para recopilar datos sobre el tiempo de ejecución de la aplicación en varias partes de su código de programa, en particular, permiten:
- recopilar y acumular datos sobre métricas de tiempo de subprocesos de ejecución en la aplicación;
- realizar estimaciones del tiempo de ejecución del código del programa con precisión para construcciones de lenguaje elemental;
- gestionar el volumen de datos extraídos activando y desactivando las herramientas de control integradas en las secciones correspondientes de los flujos de ejecución de la aplicación;
- desarrollar y aplicar pruebas de regresión que controlen la estabilidad (y detecten la degradación) de las métricas de tiempo de aplicación.
En conclusión, debe tenerse en cuenta que, fuera del alcance de esta publicación, hubo preguntas sobre la aplicación de las herramientas de control incorporadas descritas en el contexto de aplicaciones de
subprocesamiento múltiple y no se presentó ningún análisis de la precisión de los datos obtenidos por métricas de tiempo. Esto último se debe al hecho de que, en la práctica, al identificar las causas de la degradación temporal de una aplicación, los datos sobre
la distribución relativa de los costos de tiempo de ejecución entre los componentes de software de una aplicación son principalmente relevantes
. En este sentido, las preguntas sobre la precisión de los datos obtenidos se están desvaneciendo.
Apéndice 1. Código fuente para la aplicación de demostración
INITIALIZE_PROFILER int main(int argc, char * argv[]) {
Suplemento 2. Código fuente de aplicaciones C # de control de tiempo de ejecución incorporadas