Admin Fondateur
Nombre de messages : 197 Age : 40 Localisation : Tlemcen ( Algérie ) Date d'inscription : 04/12/2006
| Sujet: Comment effectuer des chronométrages précis ? Jeu 18 Jan - 16:32 | |
| [url=#chronometrageprecis]Comment effectuer des chronométrages précis ?[/url] Pour le faire, il faut utiliser les fonctions de compteur hautes performances (CHP) de l'API Win32. Il s'agit entre autres des fonctions QueryPerformanceFrequency et QueryPerformanceCounter (Windows.pas). La première renvoie la fréquence (en hertz) du compteur HP de la machine et la seconde renvoie la valeur courante d'un compteur libre. La résolution est souvent de l'ordre d'une nanoseconde (un milliardième de seconde). Déclarez ces variables : - Code:
-
Var FFrequency : Int64 ; // Fréquence du compteur hautes performances. FStart, FStop : Int64 ; // Valeurs du compteur au début et à la fin du chrono. FElapsed : Extended ; // Durée finale, en secondes. Pour effectuer le chronométrage lui-même : - Code:
-
// Initialisation du compteur hautes performances, et début du chronométrage. If Not QueryPerformanceFrequency(FFrequency) Then Raise Exception.Create('Pas de compteur hautes performances.'); QueryPerformanceCounter(FStart) ;
// Insérer ici l'opération à chronométrer, ou un appel de fonction.
// Fin de chronométrage, conversion du temps écoulé en secondes. QueryPerformanceCounter(FStop) ; FElapsed := (FStop-FStart)/FFrequency ; [center]La résolution de ce compteur est en général très élevée : il n'est pas rare que ce soit la fréquence du processeur qui serve de base. Sur un système donné, elle ne change jamais, mais elle varie d'un système à un autre : il est donc impératif de toujours récupérer la fréquence par un appel au système. Cet appel peut n'être fait qu'une seule fois dans le programme. De même, certaines machines ne possèdent pas ce compteur : il est donc nécessaire également de tester le retour de QueryPerformanceFrequency (les tests ultérieurs peuvent souvent être omis, car ils n'échouent normalement jamais si l'obtention de la fréquence a réussi la première fois). Si la version de Delphi utilisée ne déclare pas ces fonctions, insérer ces déclarations dans le code : - Code:
-
Uses Windows ;
// Requiert Delphi 4 ou supérieur, ou de réimplémenter des entiers 64 bits. function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceCounter'; function QueryPerformanceFrequency(var lpFrequency: TLargeInteger): BOOL; stdcall; external kernel32 name 'QueryPerformanceFrequency'; [/center] | |
|