我正在使用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的时钟频率相同)。

08-16 02:58