GetTickCount()和timeGetTime()之间的差异在我的测试程序

时间:2018-02-15 17:40:21

标签: c++ winapi timing gettickcount

我知道GetTickCount()timeGetTime()具有不同的分辨率,timeGetTime()的定时器分辨率可以通过调用timeBeginPeriod()来设置。

我的理解是,使用timeBeginPeriod()增加计时器的分辨率会减少系统在timeGetTime()后面的计数器的连续增量之间的休眠时间。

假设GetTickCount()的时间分辨率为16ms(其值每16ms递增16次),并且我将timeGetTime()的分辨率设置为1ms(其值每增加1) 1毫秒)。我的问题是关于计时器更新的时间点。我写了一个小测试程序,看看计时器在滴答计数器递增的时刻后面有什么样的延迟。滞后是指GetTickCount()更新时的差异timeGetTime() - GetTickCount()。例如。滞后0表示当函数timeGetTime()返回32时,滴答计数器从16更新为32,滞后4表示当timeGetTime()返回28时,滴答计数器从16递增到32这是代码:

#include <windows.h>
#include <iostream>
#include <vector>

int main(void) {

    // set time resolution to 1ms
    timeBeginPeriod(1);

    // measure tick counter interval for low resolution
    std::vector<int> difftime(200);
    int lasttick;

    for (int i = 0; i < 200; ++i) {
        lasttick = GetTickCount();
        while (!(GetTickCount()-lasttick)) ;
        difftime[i] = GetTickCount() - timeGetTime();
    }

    // reset timer resolution
    timeEndPeriod(1);

    // printout
    std::cout << "timediff" << std::endl;
    for (int i = 0; i < 200; ++i) {
        std::cout << difftime[i] << std::endl;
    }

    return 0;
}

让我感到惊讶的是,虽然在我的程序的一次运行期间两个函数之间的滞后是不变的,但是在重复执行程序之间它的差异很大。我希望这两个函数背后的计数器总是在后台运行,所以我认为执行之间的滞后应该是恒定的。

起初我认为增加timeGetTime() - 定时器的分辨率可能会在两者之间引入一些随机延迟,但是当我在执行之间将分辨率保持在1ms时,滞后在执行之间仍然会有所不同。 / p>

有人知道是什么机制导致了这种行为吗?

0 个答案:

没有答案