我正在使用QueryPerformanceCounter来测量某些功能/操作的时间。它曾经为我提供了正确的数字,例如,我可以测试Sleep(1000),它将返回非常接近1秒的时间。现在,它返回的时间非常不同。我不确定问题是什么,因为代码根本没有更改。这是代码:
预期产量:
duration : 1.000 seconds
实际输出:
duration : 187.988 seconds
码:
#include <windows.h>
#pragma comment (lib, "winmm.lib")
struct Clock{
Clock(){}
virtual ~Clock(){}
void start();
void stop();
long double duration();
LARGE_INTEGER _start, _end, _freq;
};
void Clock::start(){
_start.QuadPart = 0;
QueryPerformanceCounter(&_freq);
QueryPerformanceCounter(&_start);
}
void Clock::stop(){
QueryPerformanceCounter(&_end);
}
long double Clock::duration(){
//microseconds
LARGE_INTEGER delta;
delta.QuadPart = (_end.QuadPart - _start.QuadPart) * 1000000;
long double the_duration = ((long double)delta.QuadPart) / _freq.QuadPart;
std::cout << "duration : " << the_duration << " seconds" << std::endl;
return the_duration;
}
void main(){
Clock clock;
clock.start();
Sleep(1000);
clock.stop();
clock.duration();
std::cin.get();
}
最佳答案
您假定性能计数器的频率恰好是1000000 Hz。
您需要调用QueryPerformanceFrequency
,因为频率可能有所不同(某些内核使用主板的1.024 MHz计时器,其他内核使用CPU时间戳计数器,其运行时间大约与CPU的时钟频率相同)。