Interruptzeit
Die Unterbrechungszeit ist die Zeitspanne seit dem letzten Start des Systems in Intervallen von 100 Nanosekunden. Die Unterbrechungszeit beginnt bei Null, wenn das System gestartet wird, und wird bei jedem Taktinterrupt um die Länge einer Taktzeiteinheit erhöht. Die genaue Länge einer Taktzeiteinheit hängt von der zugrunde liegenden Hardware ab und kann zwischen Systemen variieren.
Im Gegensatz zur Systemzeit unterliegt die Unterbrechungszeit nicht Anpassungen durch Benutzer oder den Windows-Zeitservice, so dass sie die bessere Wahl für die Messung kurzer Zeitspannen ist. Anwendungen, die eine höhere Genauigkeit benötigen als die Unterbrechungszeiten ermöglicht, sollten einen hochauflösenden Timer verwenden. Verwenden Sie die QueryPerformanceFrequency-Funktion zum Abruf der Frequenz des hochauflösenden Timers und die QueryPerformanceCounter-Funktion zum Abruf des Zählerwerts.
Die Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime, and QueryUnbiasedInterruptTimePrecise können zum Abrufen der Unterbrechungszeit verwendet werden. „Unbeeinflusste“ Unterbrechungszeit bedeutet, dass nur die Zeit, in der sich das System im Arbeitszustand befindet, gezählt wird – dabei wird die Unterbrechungszeitanzahl nicht durch die Zeit „verzerrt“, die das System im Ruhezustand verbringt.
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP/2000: Die Funktion QueryUnbiasedInterruptTime ist ab Windows 7 und Windows Server 2008 R2 verfügbar.
Die von den Funktionen timeBeginPeriod und timeEndPeriod eingerichtete Timer-Auflösung wirkt sich auf die Auflösung der Funktionen QueryInterruptTime und QueryUnbiasedInterruptTime aus. Das Erhöhen der Timer-Auflösung wird jedoch nicht empfohlen, da dies die Gesamtleistung des Systems beeinträchtigen und den Stromverbrauch erhöhen kann, da verhindert wird, dass der Prozessor in Stromsparzustände geht. Stattdessen sollten Anwendungen einen hochauflösenden Timer verwenden.
Hinweis
Die Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime und QueryUnbiasedInterruptTimePrecise erzeugen unterschiedliche Ergebnisse bei Debugging- („checked“) Windows-Builds, da die Messung der Unterbrechungszeit und der Taktzeiteinheiten um ca. 49 Tage erweitert sind. Dadurch können Fehler identifiziert werden, die möglicherweise erst auftreten, wenn das System für längere Zeit ausgeführt wurde.
Das folgende Beispiel illustriert den Abruf der Unterbrechungszeit durch Aufruf der Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime und QueryUnbiasedInterruptTimePrecise. Verknüpfen Sie die OneCore.lib-Bibliothek, wenn Sie eine Konsolenanwendung erstellen, die diese Funktionen aufruft.
#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);
}
Um die abgelaufene Zeit unter Einbeziehung von Ruhezustandszeiten abzurufen, verwenden Sie die Funktion GetTickCount oder GetTickCount64 oder den System Up Time-Zähler. Dieser Leistungszähler kann aus den Leistungsdaten im Registrierungsschlüssel HKEY_PERFORMANCE_DATA abgerufen werden. Der zurückgegebene Wert ist ein 8 Byte-Wert. Weitere Informationen finden Sie unter Performance Counters.
Zugehörige Themen