Rendimiento

Uso de memoria en Delphi

Introducción

Hace poco me he encontrado en el trabajo con un programa que estaba haciendo estaba teniendo pérdidas de memoria, no demasiada cada vez pero si lo suficiente como para convertirse en un problema a medio plazo.

Cuando te encuentras un problema de consumo de memoria lo más habitual es mirar el código de la zona en la que piensas que puede estar el problema intentando encontrar el lugar donde consumes memoria que luego no vas a liberar, o bien recurrir a algún programa de monitorización de memoria que te ayude a encontrar dichos problemas (yo no he tenido suerte con ellos).

Puesto que el programa tiene demasiadas lineas de código para hacer una revisión al azar sin saber concretamente donde se producían las perdidas de memoria se me ocurrió que la forma más sencilla de acotar el problema sería ir monitorizando el uso de memoria del programa (esto así dicho suena muy facil pero en realidad no lo es tanto).

Medir el tiempo de ejecución de un fragmento de código

Introducción

En determinadas ocasiones necesitamos saber el tiempo que tarda una determinada rutina en ejecutar generalmente por que creemos que un determinado fragmento esta tardando más de lo esperado y queremos saber donde está el cuello de botella o por que tenemos alguna aplicación que tiene establecidos unas limitaciones de rendimiento que queremos cumplir.

Hay varias funciones en el la libreria kernel32.dll de windows que pueden ayudarnos en nuestra tarea. GetTickCount (y GetTickCount64) y la combinación de QueryPerformanceCounter y QueryPerformanceFrecuency.

Obtener el tiempo de CPU de procesos y tareas

Introducción

Lo primero que tenemos que considerar al intentar obtener los tiempos de uso de CPU de los procesos de Windows y de sus tareas es el hecho de que windows no está, mágicamente, calculando dicho porcentaje.

En lugar de mantener un porcentaje que no le serviría para nada, Windows, para cada proceso, guarda el tiempo de CPU que este ha estado en ejecución en modo usuario, el tiempo que ha estado en ejecución en modo sistema y el instante de creación del proceso.

Dados estos datos no es posible obtener directamente el consumo de CPU instantaneo de un proceso. Podremos obtener el consumo medio de uso de CPU por parte del proceso haciendo (TiempoMedio = TiempoUsuario + TiempoSistema / TiempoActual - TiempoCreación). Podríamos decir que la medida del consumo instantaneo de CPU es como el potencial eléctrico, no existe XD.