Buscar y usar un profiler sobre un programa propio, en el lenguaje de programación que sea. Indicar qué es necesario para usarlo, y, una vez aplicado sobre un programa, decir qué mejoras se pueden hacer sobre el mismo.
Para realizar este ejercicio he hecho un pequeño programa en c++ con 3 funciones, las he nombrado funcion1, funcion2 y funcion3, a continuación se muestra el código del programa

Como se puede ver llamo 1000 veces a cada función en el programa principal.
Después he compilado el programa incluyéndole la opción –pg para el profiler, lo he ejecutado, y genera el gmon.out que me da la siguiente salida que paso a explicar un poco:
Breve explicación sobre el perfil plano:
%time: Es el porcentaje del tiempo total de ejecución consumido por cada función. No se incluye el tiempo consumido en llamadas a otras funciones. La función con mayor porcentaje de tiempo es la funcion3 con el 65.04% del tiempo, luego están la funcion2 y la función1 con 31.36% y 2.77% respectivamente.
cumulative seconds: Es el tiempo total en segundos consumido por cada función junto con las funciones que aparecen antes de ella en el listado. No se incluye el tiempo consumido en llamadas a otras funciones. Como vemos en la captura la función3 tarda 0.71 segundos, junto con los 0.34 de la funcion2 es ese 1.05 que aparece debajo y sumado a los 0.03 de la funcion1 es el 1.08 que aparece en la última fila.
self seconds: Es el tiempo total consumido por la función, sin incluir las llamadas a otras funciones. Vemos que la función que más tiempo consume es la funcion3 con 0.71, luego vendrían la funcion2 y la funcion1.
calls: Es el número de llamadas a la función. Vemos que a cada función se la llama 1000 veces.
self us/call: Es el tiempo promedio en milisegundos consumido en cada llamada a la función, sin incluir las llamadas a otras funciones. El mayor promedio es para la funcion3 con 708.90 milisegundos, le seguiría la fucion2 y por último la funcion1.
name: Es el nombre de la función.
Breve explicación sobre el grafo de llamadas:
%time: Es el porcentaje del tiempo total consumido por la función y por las funciones hijas. Esto es lo mismo que en la captura anterior.
self: Es el tiempo consumido por la función. Podemos ver que la funcion3 consume 0.71, la funcion2 0.34 y la funcion1 0.03, vemos que en el main se incluyen estas 3 funciones al ser hijas suyas.
children: Es la suma de self y children de sus hijas. Se puede ver en la fila del main, donde aparece 1.08 segundos que es la suma de los tiempos consumidos por las 3 funciones.
called: Es el número de veces que se llama a la función. Si la función es recursiva, aparecen dos números separados por un +, el primero es el de las llamadas no recursivas y el segundo de las llamadas recursivas. En nuestro caso al no ser llamadas recursivas nos aparece las 1000 llamadas a cada función.
name: Es el nombre de la función.
Viendo que funcion3 es la función que consume más tiempo en sus llamadas, le he introducido una pequeña mejora que se puede ver en la siguiente captura:
Tras compilar y ejecutar de nuevo el programa, tenemos lo siguiente:
En el perfil plano en la columna self seconds se puede apreciar una mejora en cuanto al tiempo consumido, pasando la funcion3 de
En cuanto al grafo de llamadas pues más de lo mismo, vemos que los porcentajes están mejor repartido que antes, y que no se lo lleva casi todo la funcion3. También podemos observar que el tiempo total consumido por el programa ha bajado de
El principal problema que tenía el programa era que hacía dos asignaciones, pudiendo hacerlas en una sola, por eso al cambiar la implementación de la funcion3 con una sola asignación el tiempo que consume funcion3 con las mismas llamadas se reduce considerablemente. Por otro lado para programas tan pequeños como este no creo que sea necesario utilizar un profiler porque realmente da igual 0.77 segundos que 1.08 segundos, sin embargo, para programas más grandes aunque no tengan tantas llamadas, si que es una herramienta muy útil, para poder hacerlo más eficiente optimizando las parte del programa que veamos que consumen más tiempo. En esta ocasión ha sido un programa de prueba muy sencillo para comprender esta herramienta.






No hay comentarios:
Publicar un comentario