Condividi tramite


Tempo di interruzione

Il tempo di interruzione è il tempo trascorso dall'ultimo avvio del sistema, in intervalli di 100 nanosecondi. Il conteggio dei tempi di interruzione inizia a zero quando il sistema viene avviato e viene incrementato a ogni interruzione dell'orologio per la lunghezza di un segno di spunta dell'orologio. La lunghezza esatta di un segno di spunta dell'orologio dipende dall'hardware sottostante e può variare tra i sistemi.

A differenza del tempo di sistema, il conteggio dei tempi di interruzione non è soggetto a modifiche da parte degli utenti o del servizio ora di Windows, rendendo la scelta migliore per misurare brevi durate. Le applicazioni che richiedono maggiore precisione rispetto al conteggio dei tempi di interruzione devono usare un timer ad alta risoluzione. Utilizzare la funzione QueryPerformanceFrequency per recuperare la frequenza del timer ad alta risoluzione e la funzione QueryPerformanceCounter per recuperare il valore del contatore.

Le funzioni QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise possono essere usate per recuperare il conteggio dei tempi di interruzione. Unbiased interrupt-time significa che solo il tempo in cui il sistema si trova nello stato di lavoro viene conteggiato, pertanto il conteggio dei tempi di interruzione non è "pregiudiziato" per tempo trascorso dal sistema nel sonno o nell'ibernazione.

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP/2000: La funzione QueryUnbiasedInterruptTime è disponibile a partire da Windows 7 e Windows Server 2008 R2.

La risoluzione timer impostata dalle funzioni timeBeginPeriod e timeEndPeriod influisce sulla risoluzione delle funzioni QueryInterruptTime e QueryUnbiasedInterruptTime . Tuttavia, l'aumento della risoluzione del timer non è consigliato perché può ridurre le prestazioni complessive del sistema e aumentare il consumo di energia impedendo al processore di immettere stati di risparmio energia. Le applicazioni devono invece usare un timer ad alta risoluzione.

Nota

Le funzioni QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise generano risultati diversi nelle build di debug ("checked") perché il conteggio dei tempi di interruzione e il conteggio dei tick sono avanzati per circa 49 giorni. Ciò consente di identificare i bug che potrebbero non verificarsi fino a quando il sistema non è stato in esecuzione per molto tempo. La compilazione selezionata è disponibile per i sottoscrittori MSDN tramite il sito Web MICROSOFT Developer Network (MSDN).

 

Nell'esempio seguente viene illustrato come recuperare il conteggio dei tempi di interruzione chiamando le funzioni QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise. Collegarsi alla libreria OneCore.lib quando si compila un'applicazione console che chiama queste funzioni.

#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);
}

Per recuperare tempo trascorso che account per la sospensione o l'ibernazione, usare la funzione GetTickCount o GetTickCount64 oppure usare il contatore delle prestazioni di System Up Time. Questo contatore delle prestazioni può essere recuperato dai dati sulle prestazioni nella chiave del Registro di sistema HKEY_PERFORMANCE_DATA. Il valore restituito è un valore a 8 byte. Per altre informazioni, vedere i contatori delle prestazioni.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod