Share via


Heure d’interruption

Le temps d’interruption est le temps écoulé depuis le dernier démarrage du système, par intervalles de 100 nanosecondes. Le nombre de temps d’interruption commence à zéro au démarrage du système et est incrémenté à chaque interruption d’horloge par la longueur d’une horloge. La longueur exacte d’une horloge dépend du matériel sous-jacent et peut varier d’un système à l’autre.

Contrairement au temps système, le nombre de temps d’interruption n’est pas soumis à des ajustements par les utilisateurs ni par le service de temps Windows, ce qui en fait un meilleur choix pour mesurer les durées courtes. Les applications qui nécessitent une précision supérieure au nombre de temps d’interruption doivent utiliser un minuteur haute résolution. Utilisez la fonction QueryPerformanceFrequency pour récupérer la fréquence du minuteur haute résolution et la fonction QueryPerformanceCounter pour récupérer la valeur du compteur.

Les fonctions QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime et QueryUnbiasedInterruptTimePrecise peuvent être utilisées pour récupérer le nombre de temps d’interruption. Le temps d’interruption non biaisé signifie que seul le temps pendant lequel le système est à l’état opérationnel est compté. Par conséquent, le nombre de temps d’interruption n’est pas « biaisé » par le temps passé par le système en veille ou en veille prolongée.

Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP/2000 : La fonction QueryUnbiasedInterruptTime est disponible à partir de Windows 7 et Windows Server 2008 R2.

La résolution du minuteur définie par les fonctions timeBeginPeriod et timeEndPeriod affecte la résolution des fonctions QueryInterruptTime et QueryUnbiasedInterruptTime . Toutefois, l’augmentation de la résolution du minuteur n’est pas recommandée, car elle peut réduire les performances globales du système et augmenter la consommation d’énergie en empêchant le processeur d’entrer dans des états d’économie d’énergie. Au lieu de cela, les applications doivent utiliser un minuteur haute résolution.

Notes

Les fonctions QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime et QueryUnbiasedInterruptTimePrecise produisent des résultats différents sur les builds de débogage (« vérifié ») de Windows, car le nombre d’interruptions et le nombre de cases sont avancés d’environ 49 jours. Cela permet d’identifier les bogues qui peuvent ne pas se produire tant que le système n’est pas en cours d’exécution depuis longtemps. La build vérifiée est disponible pour les abonnés MSDN via le site Web MSDN (Microsoft Developer Network).

 

L’exemple suivant montre comment récupérer le nombre d’interruptions en appelant les fonctions QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime et QueryUnbiasedInterruptTimePrecise . Créez un lien vers la bibliothèque OneCore.lib lorsque vous créez une application console qui appelle ces fonctions.

#include "stdafx.h"
#include <windows.h>
#include <realtimeapiset.h>

void InterruptTimeTest()
{
    ULONGLONG InterruptTime;
    ULONGLONG PreciseInterruptTime;
    ULONGLONG UnbiasedInterruptTime;
    ULONGLONG PreciseUnbiasedInterruptTime;

        // The interrupt time that QueryInterruptTime reports is based on the 
        // latest tick of the system clock timer. The system clock timer is 
        // the hardware timer that periodically generates interrupts for the 
        // system clock. The uniform period between system clock timer 
        // interrupts is referred to as a system clock tick, and is typically 
        // in the range of 0.5 milliseconds to 15.625 milliseconds, depending 
        // on the hardware platform. The interrupt time value retrieved by 
        // QueryInterruptTime is accurate within a system clock tick.

    QueryInterruptTime(&InterruptTime);
    printf("Interrupt time: %.7f seconds\n", 
            (double)InterruptTime/(double)10000000);

        // Precise interrupt time is more precise than the interrupt time that
        // QueryInterruptTime reports because the functions that report  
        // precise interrupt time read the timer hardware directly.

    QueryInterruptTimePrecise(&PreciseInterruptTime);
    printf("Precise interrupt time: %.7f seconds\n", 
            (double)PreciseInterruptTime/(double)10000000);

        // Unbiased interrupt time means that only time that the system is in 
        // the working state is counted. Therefore, the interrupt-time count 
        // is not biased by time the system spends in sleep or hibernation.

    QueryUnbiasedInterruptTime(&UnbiasedInterruptTime);
    printf("Unbiased interrupt time: %.7f seconds\n", 
            (double)UnbiasedInterruptTime/(double)10000000);

        // QueryUnbiasedInterruptTimePrecise gets an interrupt-time count
        // that is both unbiased and precise, as defined in the comments
        // included earlier in this example.

    QueryUnbiasedInterruptTimePrecise(&PreciseUnbiasedInterruptTime);
    printf("Precise unbiased interrupt time: %.7f seconds\n", 
            (double)PreciseUnbiasedInterruptTime/(double)10000000);

}

int main(void)
{
    void InterruptTimeTime();

    InterruptTimeTest();
    return(0);
}

Pour récupérer le temps écoulé qui tient compte de la mise en veille ou de la mise en veille prolongée, utilisez la fonction GetTickCount ou GetTickCount64 , ou utilisez le compteur de performances Temps de mise en service du système. Ce compteur de performances peut être récupéré à partir des données de performances dans le HKEY_PERFORMANCE_DATA de clé de Registre. La valeur retournée est une valeur de 8 octets. Pour plus d’informations, consultez Compteurs de performances.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod