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.
El proceso es muy similar al método anterior
En C# (al menos en Visual Studio 2005) las funciones no estan incluidas en ninguna biblioteca por defecto por lo que, antes de poder usarlas, deberemos importarlas de la librería kernel.dll, para ello, en la clase en que las vayamos a utilizar debemos incluir las siguientes lineas.
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(
out long lpFrequency);
No es mala idea crear una clase estática que encapsule las llamadas a estas funciones para no tener que incluir esas lineas en todas las clases en las que queramos usarlas.
La principal diferencia entre cualquiera de los GetTickCount y la función QueryPerformanceCounter es la precisión de la medida realizada. GetTickCount nos devuelve el numero de milisegundos transcurridos desde que se arrancó el sistema y tiene una precisión del orden del milisegundo (aunque puede ser mayor que un milisegundo), es decir, si hacemos una llamada a GetTickCount y 500 microsegundos despues hacemos otra llamada a GetTickCount ambas llamadas nos devolverán exactamente lo mismo.
La función QueryPerformanceCounter toma el valor actual del monitor de alta resolución del sistema (hardware). Tiene una resolución muchisimo más alta (del orden del nanosegundo) pero para que pueda funcionar obviamente el hardware tiene que tener un monitor de alta resolución (aunque prácticamente todos procesadores en la actualidad lo tienen).
Por último la diferencia entre GetTickCount y GetTickCount64 es, como indica el nombre, el tipo devuelto. La función GetTickCount devuelve enteros de 32 bits por lo que la máxima distancia entre dos llamadas es de 49,7 dias, es decir, si contamos con que en el momento de arranque del sistema el número de 'ticks' es cero, 49,7 días después dicho valor volverá a ser cero. ¿Que significa esto? Significa que corremos el riesgo de que entre dos llamadas a la función GetTickCount se produzca un reseteo de forma que cuando calculemos el numero de milisegundos transcurridos entre ambas medidas obtendremos un valor erroneo.
Stopwatch class
Hi.
.NET 2.0(VS 2005) Introduces the Stopwatch class for this task.
System.Diagnostics.Stopwatch (http://msdn2.microsoft.com/en-us/library/System.Diagnostics.Stopwatch.aspx)
--
Johan Hernandez
http://johansoft.blogspot.com