Share via


Tempo de Interrupção

O tempo de interrupção é a quantidade de tempo desde que o sistema foi iniciado pela última vez, em intervalos de 100 nanossegundos. A contagem de tempo de interrupção começa em zero quando o sistema é iniciado e é incrementado em cada interrupção de relógio pelo comprimento de um tique de relógio. O comprimento exato de um tique de relógio depende do hardware subjacente e pode variar entre os sistemas.

Ao contrário do tempo do sistema, a contagem de tempo de interrupção não está sujeita a ajustes por parte dos usuários ou do serviço de horário do Windows, tornando-a uma opção melhor para medir durações curtas. Os aplicativos que exigem maior precisão do que a contagem de tempo de interrupção devem usar um temporizador de alta resolução. Use a função QueryPerformanceFrequency para recuperar a frequência do temporizador de alta resolução e a função QueryPerformanceCounter para recuperar o valor do contador.

As funções QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise podem ser usadas para recuperar a contagem de tempo de interrupção. Tempo de interrupção imparcial significa que apenas o tempo em que o sistema está no estado de trabalho é contado— portanto, a contagem de tempo de interrupção não é "tendenciosa" pelo tempo que o sistema passa em suspensão ou hibernação.

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP/2000: A função QueryUnbiasedInterruptTime está disponível a partir do Windows 7 e do Windows Server 2008 R2.

A resolução de temporizador definida pelas funções timeBeginPeriod e timeEndPeriod afeta a resolução das funções QueryInterruptTime e QueryUnbiasedInterruptTime . No entanto, não é recomendável aumentar a resolução do temporizador porque ele pode reduzir o desempenho geral do sistema e aumentar o consumo de energia impedindo que o processador entre em estados de economia de energia. Em vez disso, os aplicativos devem usar um temporizador de alta resolução.

Observação

As funções QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise produzem resultados diferentes em builds de depuração ("verificados") do Windows, pois a contagem de tempo de interrupção e a contagem de tiques são avançadas em aproximadamente 49 dias. Isso ajuda a identificar bugs que podem não ocorrer até que o sistema esteja em execução há muito tempo. O build verificado está disponível para assinantes do MSDN por meio do site do MSDN (Microsoft Developer Network ).

 

O exemplo a seguir mostra como recuperar a contagem de tempo de interrupção chamando as funções QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise . Vincule à biblioteca OneCore.lib ao criar um aplicativo de console que chama essas funções.

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

Para recuperar o tempo decorrido que contabiliza a suspensão ou hibernação, use a função GetTickCount ou GetTickCount64 ou use o contador de desempenho Tempo de Espera do Sistema. Esse contador de desempenho pode ser recuperado dos dados de desempenho na chave do Registro HKEY_PERFORMANCE_DATA. O valor retornado é um valor de 8 bytes. Para obter mais informações, consulte Performance Counters.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod