"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.
Comments:
Que lastima que no sigas mas con el Blog !!!!

Gerardo
 
Gerardo:

No es fácil mantener un blog.
Elegir el tema, desarrollarlo y pasarlo al blog.
Y el tiempo que tengo es muy escaso.
Pero como uno de los problemas principales es encontrar el tema para escribir, quizas me puedan ayudar pidiendo temas específicos.

Gracias y prometo seguir escribiendo.

Walter Negro
 
Walter, sos re groso, ya con todos los temas q resolviste en estos dias mas los de ayer, día a día demostras tu desborde de conocimientos.

Matías
 
Publicar un comentario

<< Home

Powered by Blogger