"Cosa" de Negro
agosto 26, 2005
 
Optimización - Profiler
El profiler es una herramienta muy útil para optimizar el funcionamiento de nuestras aplicaciones.
Nos permite obtener datos como cantidad de veces que se ejecuta una función y tiempo total empleado por dicha función.

Estos datos nos permiten conocer los puntos donde debemos apuntar nuestros esfuerzos en las optimizaciones.

El profile está compuesto por una parte por una clase en PRG y por otra parte por una serie de funciones existentes en el corazón del motor de ejecución.

La clase es la encargada de recuperar y ordenar la información generada por las funciones internas.
Las funciones internas se encargan de recabar en bruto los tiempos y cantidad de veces que las funciones son ejecutadas.

Además existen otras 2 clases que usando la información generada por la clase profile, generan reportes en forma de texto o browse.

El único gran problema que tenemos, es que la medición de tiempos tiene una granularidad extremadamente grande.
Se miden los tiempos en base a los ticks de reloj y ocurren 18 ticks por segundo.
Esto hace que cuanto más rápida es la ejecución de una función más error se introduce en la medición de tiempos.

Debemos tener presente, que los tiempos medidos son los tiempos totales de ejecución de cada función.
Esto incluye a los tiempos usados por las funciones a las cuales se llama desde dentro de la primer función.
Si A llama a B, y A tarda 2.1 segundos y B 2 segundos, el tiempo real de ejecución de la función A es 0.1 segundos.

En xharbour\tests\testprof.prg hay un ejemplo muy sencillo de como se usa el profile.
http://cvs.sourceforge.net/viewcvs.py/*checkout*/xharbour/xharbour/tests/testprof.prg

Los pasos básicos son los siguientes:

1- Crear el objeto HBProfile() antes de activar el Profiler.

oProfile := HBProfile():new()

2- Activar el relevamiento de la información.

__setProfiler( .T. )

3- Ejecutar el código que se quiere medir.

4- Desactivar el relevamiento de la información.

__setProfiler( .F. )

5- Obtener una foto del estado de la información relevada.

oProfile:gather()

6- Ordenar la información por:

oProfile:callSort() // Ordenado por cantidad de llamadas
oProfile:nameSort() // Ordenado por nombres de funciones
oProfile:timeSort() // Ordenado por tiempo de ejecución.

7- Generar un reporte

memoedit( HBProfileReportToString():new( oProfile:callSort() ):generate( {|o| o:nCalls > 0 } ), 1,,,, .F. )


Es posible ejecutar arrancar y parar el relevamiento de la información las veces que sea necesario.
Por ejemplo podemos parar el relevamiento mientras esperamos que el usuario ingrese datos.
Sin embargo, al llamar a oProfile:gather(), además de sacar la foto del estado actual, se está eliminando la información releavada hasta el momento.

Hay un uso avanzado del profiler, que sirve para obtener información de los PCODES usados y la cantidad de veces que se ejecutó cada uno.

Para esto se usa

oProfile := HBProfileLowLevel():new()

el resto de la operatoria es similar.


Esta es una herramienta más que podemos usar para optimizar el funcionamiento de nuestras aplicaciones, conocer los cuellos de botella y actuar donde sea necesario.
 
Escribiendo algo
La verdad es que me llevo muy bien escribiendo.
Escribiendo programas, claro, porque escribir en lenguaje "humano" me cuesta bastante.
Lo que más me cuesta es ordenar un pensamiento o una idea y transformarla en frases coherentes y entendibles.
Porque no es solo escribir, además, hay que cuidar el estilo, hacerse entender, evitar los regionalismos para que se entienda en cualquier otro lugar hispanohablante.

Realmente, mantener un blog técnico se parece mucho a escribir documentación.
Siento mucho más complicado escribir "humano", que transformar una idea en un programa.

En este tiempo ausente he recibido varios mensajes extrañando nuevas notas, asi que agradezco a todos los que han leido mis mensajes y espero que no se hayan ido del todo.

Gracias

Powered by Blogger