JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cronometraje de alta precisión en .NET

Una carencia tonta que tenían las versiones 1.x de .NET era la de una forma de medir el tiempo con elevada precisión. Y digo carencia "tonta" porque en realidad no cuesta mucho crear una clase así y es algo que los programadores solemos agradecer ya que lo usamos mucho para medir la velocidad de ciertos fragmentos de código y cosas así.

Una forma muy sencilla pero al mismo tiempo muy poco precisa de hacer mediciones es usar la clase DateTime de .NET. Puede servirnos para medir espacios de tiempo muy grandes (de muchos segundos) en los que no sea necesario afinar demasiado o conseguir mucha precisión, así:

DateTime comienzo = DateTime.Now;
//Aquí ejecutamos lo que sea que vamos a medir
double tiempo = (DateTime.Now - comienzo).TotalMilliseconds;

Con esto obtenemos el número de milisegundos entrela fecha de comienzo y la de fin pero la precisión es relativamente mala porque no se usan los contadores de alto rendimiento del sistema.

Otra opción es usar la API de Windows para acceder a estos contadores de alta precisión del sistema, para lo que deberemos definir las funciones externas así:

 [System.Runtime.InteropServices.DllImport("KERNEL32")]
 private static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
 [System.Runtime.InteropServices.DllImport("KERNEL32")]
 private static extern bool QueryPerformanceFrequency(ref long lpFrequency);

Ahora para medir el tiempo trasncurrido en ticks del reloj interno habría que escribir algo similar a lo siguiente:

long frecuencia = 0;
QueryPerformanceFrequency(ref frecuencia); //Frecuencia del reloj interno
long comienzo= 0;
QueryPerformanceCounter(ref comienzo);
//Aquí ejecutamos lo que sea que vamos a medir
long final = 0;
QueryPerformanceCounter(ref final);
float intervalo = (float)(final - comienzo) / frecuencia;

Así tendríamos en la variable 'intervalo' el número de milisegundos pero couna gran precisión y decimales incluidos.

Bueno, por fortuna .NET 2.0 trae "de serie" una clase especializada en estos menesteres y que ya nos permite hacer este tipo de mediciones de forma nativa e inmediata pero sin sacrificar la precisión. Se trata de la clase Stopwatch que se encuentra en el espacio de nombres System.Diagnostics. Ofrece una propiedad Frequency para ver la frecuencia así como varios métodos destinados a cronometrar intervalos. Puedes encontrar detalles de esta clase y sus miembros en http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch

José Manuel Alarcón
Banner

Agregar comentario