Время прерывания

Время прерывания — это время с момента последнего запуска системы в интервале 100 наносекунд. Счетчик времени прерываний начинается с нуля при запуске системы и увеличивается при каждом прерывании часов на длину такта часов. Точная длина тактов часов зависит от базового оборудования и может отличаться в разных системах.

В отличие от системного времени, количество прерываний не подлежит корректировке пользователями или службой времени Windows, что делает его лучшим выбором для измерения коротких длительности. Приложения, которым требуется более высокая точность, чем количество прерываний, должны использовать таймер с высоким разрешением. Используйте функцию QueryPerformanceFrequency для получения частоты таймера высокого разрешения и функцию QueryPerformanceCounter для получения значения счетчика.

Для получения количества прерываний можно использовать функции QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime и QueryUnbiasedInterruptTimePrecise . Беспристрастное время прерывания означает, что учитывается только время, когда система находится в рабочем состоянии, поэтому счетчик времени прерывания не является "смещенным" по времени, которое система проводит в спящем режиме или гибернации.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: Функция QueryUnbiasedInterruptTime доступна начиная с Windows 7 и Windows Server 2008 R2.

Разрешение таймера, заданное функциями timeBeginPeriod и timeEndPeriod , влияет на разрешение функций QueryInterruptTime и QueryUnbiasedInterruptTime . Однако увеличение разрешения таймера не рекомендуется, так как это может снизить общую производительность системы и увеличить энергопотребление, не позволяя процессору переходить в состояния энергосбережения. Вместо этого приложения должны использовать таймер с высоким разрешением.

Примечание

Функции QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime и QueryUnbiasedInterruptTimePrecise дают различные результаты в отладочных сборках Windows , так как количество прерываний и число тактов расширены примерно на 49 дней. Это помогает выявлять ошибки, которые могут не возникать, пока система не будет работать в течение длительного времени. Проверенная сборка доступна подписчикам MSDN на веб-сайте Microsoft Developer Network (MSDN).

 

В следующем примере показано, как получить количество прерываний путем вызова функций QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime и QueryUnbiasedInterruptTimePrecise . Ссылка на библиотеку OneCore.lib при создании консольного приложения, которое вызывает эти функции.

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

Чтобы получить затраченное время, которое учитывается для спящего режима или гибернации, используйте функцию GetTickCount или GetTickCount64 или счетчик производительности System Up Time. Этот счетчик производительности можно получить из данных о производительности в разделе реестра HKEY_PERFORMANCE_DATA. Возвращаемое значение представляет собой 8-байтовое значение. Дополнительные сведения см. в статье Performance Counters.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod