Efectuar un cronometraje preciso
Artículo por Club Developers · 11 marzo 2006
2876 vistas
Para realizar un cronometraje preciso, tendremos que usar las funciones de contador de altas prestaciones (CAP) del API Win32.
Entre otras tenemos las funciones QueryPerformanceFrequency y QueryPerformanceCounter de la unidad Windows
La primera devuelve la frecuencia (en hercios) el contador HP de la máquina y la segunda devuelve el valor corriente de un contador libre. La resolución suele ser del orden de 1 nanosegundo.
Declaramos estas variables:
Veamos cómo hacer el cronometraje:
La resolución de este contador es en general muy elevada: no es de extrañar que sea la frecuencia del ordenador la que sirva de base. Sobre un sistema dado, ésta no cambia nunca, pero ésta puede cambiar de un sistema a otro: por esto es imprescindible recuperar siempre la frecuencia para una llamada al sistema. Esta llamada sólo puede realizarse una vez en el programa. No obstante, hay algunos ordenadores que no tienen contador: por ésto es necesario verificar la devolición de la función QueryPerformanceFrequency.
Si la versión de Delphi que usamos no tiene declaradas estas funciones, tendremos que hacerlo nosotros mismos:
Entre otras tenemos las funciones QueryPerformanceFrequency y QueryPerformanceCounter de la unidad Windows
La primera devuelve la frecuencia (en hercios) el contador HP de la máquina y la segunda devuelve el valor corriente de un contador libre. La resolución suele ser del orden de 1 nanosegundo.
Declaramos estas variables:
delphi
Var  FFrequency  : Int64  ;  // frecuencia del contador de altas prestaciones.  FStart, FStop : Int64  ;  // valor del contador al inicio y fin del cronometraje.  FElapsed   : Extended ;Â
Veamos cómo hacer el cronometraje:
delphi
// inicialización del contador de altas prestaciones y inicio del cronometraje if not QueryPerformanceFrequency(FFrequency) then  raise Exception.Create('no hay contador de altas prestaciones.'); QueryPerformanceCounter(FStart); // Aquà va la operación a cronometrar o una llamada a la función a cronometrar. // fin del cronometraje, conversión del tiempo en segundos. QueryPerformanceCounter(FStop); FElapsed := (FStop - FStart) / FFrequency;
La resolución de este contador es en general muy elevada: no es de extrañar que sea la frecuencia del ordenador la que sirva de base. Sobre un sistema dado, ésta no cambia nunca, pero ésta puede cambiar de un sistema a otro: por esto es imprescindible recuperar siempre la frecuencia para una llamada al sistema. Esta llamada sólo puede realizarse una vez en el programa. No obstante, hay algunos ordenadores que no tienen contador: por ésto es necesario verificar la devolición de la función QueryPerformanceFrequency.
Si la versión de Delphi que usamos no tiene declaradas estas funciones, tendremos que hacerlo nosotros mismos:
delphi
Uses Windows ; // requiere Delphi 4 o superior function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceCounter'; function QueryPerformanceFrequency(var lpFrequency: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceFrequency';