Поделиться через


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

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

В отличие от системного времени, количество прерываний не зависит от корректировки пользователей или службы времени 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 дней. Это помогает выявить ошибки, которые могут не возникать до тех пор, пока система не будет работать в течение длительного времени.

 

В следующем примере показано, как получить количество прерываний, вызвав функции 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 или используйте счетчик производительности времени ожидания системы. Этот счетчик производительности можно получить из данных о производительности в HKEY_PERFORMANCE_DATA раздела реестра. Возвращаемое значение — 8-байтовое значение. Дополнительные сведения см. в статье Performance Counters.

QueryInterruptTime

QueryInterruptTimePrecise

QueryUnbiasedInterruptTime

QueryUnbiasedInterruptTimePrecise

timeBeginPeriod

timeEndPeriod