Tempo de Interrupção
O tempo de interrupção é a quantidade de tempo decorrido 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 é incrementada em cada interrupção de relógio pela duração de um tique de relógio. A duração exata de um tique de relógio depende do hardware subjacente e pode variar entre os sistemas.
Diferentemente do tempo do sistema, a contagem do tempo de interrupção não está sujeita a ajustes pelos usuários ou pelo serviço de tempo do Windows, o que a torna uma escolha melhor para medir curtas durações. 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. O tempo de interrupção imparcial significa que apenas o tempo que o sistema está no estado de funcionamento é contado. Portanto, a contagem do 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 do temporizador definida pelas funções timeBeginPeriod e timeEndPeriod afeta a resolução das funções QueryInterruptTime e QueryUnbiasedInterruptTime. No entanto, aumentar a resolução do temporizador não é recomendado porque 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 compilações de depuração ("verificadas") do Windows, porque a contagem do 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 por um longo tempo.
O exemplo a seguir mostra como recuperar a contagem de tempo de interrupção chamando as funções QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise. Link para a 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 leva em conta a suspensão ou hibernação, use a função GetTickCount ou GetTickCount64 ou use o contador de desempenho do tempo de atividade do sistema. Esse contador de desempenho pode ser recuperado dos dados de desempenho na chave de registro HKEY_PERFORMANCE_DATA. O valor retornado é um valor de 8 bytes. Para obter mais informações, consulte Performance Counters.
Tópicos relacionados