Unterbrechungszeit

Interruptzeit ist die Zeitspanne seit dem letzten Start des Systems in Intervallen von 100 Nanosekunden. Die Interruptzeitanzahl beginnt bei null, wenn das System gestartet wird, und wird bei jeder Unterbrechung um die Länge eines Taktstrichs erhöht. Die genaue Länge eines Takts hängt von der zugrunde liegenden Hardware ab und kann von System zu System zu System variieren.

Im Gegensatz zur Systemzeit unterliegt die Anzahl der Unterbrechungszeiten keine Anpassungen durch Benutzer oder den Windows-Zeitdienst, was sie zu einer besseren Wahl für die Messung kurzer Dauer macht. Anwendungen, die eine höhere Genauigkeit als die Anzahl der Unterbrechungszeiten erfordern, sollten einen Timer mit hoher Auflösung verwenden. Verwenden Sie die QueryPerformanceFrequency-Funktion , um die Häufigkeit des Timers mit hoher Auflösung und die QueryPerformanceCounter-Funktion abzurufen, um den Wert des Zählers abzurufen.

Die Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime und QueryUnbiasedInterruptTimePrecise können verwendet werden, um die Interruptzeitanzahl abzurufen. Unvoreingenommene Interruptzeit bedeutet, dass nur die Zeit gezählt wird, in der sich das System im Betriebszustand befindet. Daher ist die Interruptzeitanzahl nicht nach der Zeit "verzerrt", die das System im Ruhezustand oder Ruhezustand verbringt.

Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP/2000: Die QueryUnbiasedInterruptTime-Funktion ist ab Windows 7 und Windows Server 2008 R2 verfügbar.

Die von den Funktionen timeBeginPeriod und timeEndPeriod festgelegte Timerauflösung wirkt sich auf die Auflösung der Funktionen QueryInterruptTime und QueryUnbiasedInterruptTime aus. Es wird jedoch nicht empfohlen, die Timerauflösung zu erhöhen, da dies die Gesamtleistung des Systems verringern und den Stromverbrauch erhöhen kann, indem verhindert wird, dass der Prozessor in Energiesparzustände wechselt. Stattdessen sollten Anwendungen einen Timer mit hoher Auflösung verwenden.

Hinweis

Die Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime und QueryUnbiasedInterruptTimePrecise erzeugen unterschiedliche Ergebnisse bei Debugbuilds von Windows ("überprüft"), da die Interruptzeitanzahl und die Anzahl der Teilstriche um ungefähr 49 Tage erweitert werden. Dies hilft, Fehler zu identifizieren, die möglicherweise erst auftreten, wenn das System über einen längeren Zeitraum ausgeführt wurde. Der überprüfte Build ist für MSDN-Abonnenten über die Msdn-Website (Microsoft Developer Network) verfügbar.

 

Im folgenden Beispiel wird gezeigt, wie die Interruptzeitanzahl durch Aufrufen der Funktionen QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime und QueryUnbiasedInterruptTimePrecise abgerufen wird. Verknüpfen Sie die Bibliothek OneCore.lib, 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);
}

Verwenden Sie zum Abrufen der verstrichenen Zeit, die für den Ruhezustand oder den Ruhezustand erforderlich ist, die Funktion GetTickCount oder GetTickCount64 , oder verwenden Sie den System Up Time-Leistungsindikator. Dieser Leistungsindikator 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.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod