我知道GetTickCount()
并且timeGetTime()
有不同的分辨率,并且timeGetTime()
可以通过调用来设置计时器分辨率timeBeginPeriod()
。
我的理解是,增加计时器的分辨率使用timeBeginPeriod()
减少了系统在连续递增到后面的计数器之间的睡眠时间timeGetTime()
。
假设时间分辨率GetTickCount()
为 16ms(其值每 16ms 增加 16),我将分辨率设置timeGetTime()
为 1ms(其值每 1ms 增加 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()
-timer 的分辨率可能会通过在两者之间引入一些随机延迟来导致这种情况,但是当我在执行之间将分辨率保持在 1 毫秒时,执行之间的延迟仍然会有所不同。
有谁知道是什么机制导致这种行为?