Tempo di interruzione
Il tempo di interruzione è la quantità di tempo trascorsa dall'ultimo avvio del sistema, in intervalli di 100 nanosecondi. Il conteggio di interrupt-time inizia a zero all'avvio del sistema e viene incrementato a ogni interrupt di clock per la lunghezza di un segno di spunta dell'orologio. La lunghezza esatta di un tick di clock dipende dall'hardware sottostante e può variare tra i sistemi.
A differenza dell'ora di sistema, il conteggio dei tempi di interruzione non è soggetto a modifiche da parte degli utenti o del servizio ora di Windows, rendendolo una scelta migliore per misurare brevi durate. Le applicazioni che richiedono maggiore precisione rispetto al conteggio di interrupt-time devono usare un timer ad alta risoluzione. Utilizzare la funzione QueryPerformanceFrequency per recuperare la frequenza del timer ad alta risoluzione e della funzione QueryPerformanceCounter per recuperare il valore del contatore.
È possibile usare le funzioni QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise per recuperare il conteggio di interrupt-time. Il tempo di interruzione non distorto indica che viene conteggiato solo il tempo di conteggio del sistema nello stato di lavoro, pertanto il conteggio dei tempi di interruzione non viene "distorto" per tempo trascorso dal sistema in sospensione o 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 del 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. Al contrario, le applicazioni devono usare un timer ad alta risoluzione.
Nota
Le funzioni QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime e QueryUnbiasedInterruptTimePrecise producono risultati diversi nelle compilazioni di debug ("checked") di Windows, perché il conteggio dei tempi di interruzione e il conteggio dei tick sono avanzati di circa 49 giorni. Ciò consente di identificare i bug che potrebbero non verificarsi fino a quando il sistema non è stato eseguito per molto tempo.
Nell'esempio seguente viene illustrato come recuperare il numero di interrupt-time 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 il tempo trascorso che indica la sospensione o l'ibernazione, usare la funzione GetTickCount o GetTickCount64 oppure usare il contatore delle prestazioni Tempo di attività di sistema. 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.
Argomenti correlati