Maison >développement back-end >C++ >Comment QueryPerformanceCounter peut-il obtenir une mesure précise du temps en C ?

Comment QueryPerformanceCounter peut-il obtenir une mesure précise du temps en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 00:24:08153parcourir

How Can QueryPerformanceCounter Achieve Accurate Time Measurement in C  ?

Implémentation de QueryPerformanceCounter pour une mesure précise du temps

QueryPerformanceCounter est une fonction très précise fournie par Microsoft Windows pour mesurer des intervalles de temps en microsecondes. Pour l'implémenter efficacement en C, disséquons son utilisation étape par étape.

Au départ, vous devez inclure le fichier d'en-tête nécessaire :

#include <windows.h>

Ensuite, déclarez deux variables globales pour stocker le fréquence du compteur de performance et point de départ :

double PCFreq = 0.0;
__int64 CounterStart = 0;

La fonction StartCounter() initialise la performance counter :

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&amp;li))
        cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&amp;li);
    CounterStart = li.QuadPart;
}

QueryPerformanceFrequency récupère la fréquence du compteur et QueryPerformanceCounter enregistre la valeur actuelle.

Pour mesurer le temps écoulé depuis l'appel de StartCounter, utilisez la fonction GetCounter() :

double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&amp;li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

La fonction calcule le temps écoulé en comparant la valeur actuelle du compteur à la valeur de départ, ajustement de la fréquence du compteur.

Exemple d'utilisation :

StartCounter();
Sleep(1000);
cout << GetCounter() <<"\n";

Ce programme devrait générer un nombre proche de 1000, démontrant la précision du compteur pour mesurer des durées en microsecondes.

Vous pouvez personnaliser la précision du compteur en modifiant le PCFreq calcul :

  • Secondes : PCFreq = double(li.QuadPart);
  • Microsecondes : PCFreq = double(li.QuadPart)/1000000.0;

Le choix dépend du niveau de granularité souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn