我知道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>
有人知道是什么机制导致了这种行为吗?