Temps d’interruption
Le temps d’interruption est le temps écoulé depuis le dernier démarrage du système, en intervalles de 100 nanosecondes. Le compteur de temps d’interruption commence à zéro au démarrage du système et est incrémenté à chaque interruption d’horloge par la durée d’un tick d’horloge. La durée exacte d’un tick d’horloge dépend du matériel sous-jacent et peut varier d’un système à l’autre.
Contrairement au temps système, le compteur de temps d’interruption n’est pas sujet aux ajustements par les utilisateurs ou le service de temps Windows, ce qui en fait un meilleur choix pour mesurer des durées courtes. Les applications nécessitant une précision supérieure à celle du compteur 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 compteur de temps d’interruption. Le temps d’interruption non biaisé signifie que seul le temps pendant lequel le système est en état de fonctionnement est compté. Par conséquent, le compteur de temps d’interruption n’est pas « biaisé » par le temps que le système passe en veille ou en mise 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. Cependant, il n’est pas recommandé d’augmenter la résolution du minuteur car cela 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. Les applications devraient plutôt utiliser un minuteur haute résolution.
Remarque
Les fonctions QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime et QueryUnbiasedInterruptTimePrecise produisent des résultats différents sur les builds de débogage (« vérifiés ») de Windows, car le compteur de temps d’interruption et le compteur de ticks sont avancés d’environ 49 jours. Cela aide à identifier les bugs qui pourraient ne pas se produire avant que le système n’ait fonctionné pendant une longue période.
L’exemple suivant montre comment récupérer le compteur de temps d’interruption en appelant les fonctions QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime et QueryUnbiasedInterruptTimePrecise. Liez à la bibliothèque OneCore.lib lorsque vous construisez 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 veille ou de la mise en veille prolongée, utilisez la fonction GetTickCount ou GetTickCount64, ou utilisez le compteur de performance System Up Time. Ce compteur de performance peut être récupéré à partir des données de performance dans la clé de registre HKEY_PERFORMANCE_DATA. La valeur retournée est une valeur de 8 octets. Pour plus d’informations, consultez Compteurs de performances.
Rubriques connexes