QueryPerformanceCounter抛出不正确的数字

问题描述 投票:0回答:2

我正在使用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();
}
c++ timer 64-bit performancecounter
2个回答
1
投票

您假设来自性能计数器的频率恰好是1000000 Hz。

您需要调用QueryPerformanceFrequency,因为频率可能会有所不同(某些内核使用主板的1.024 MHz计时器,其他内核使用CPU时间戳计数器,其运行时间大约是CPU的时钟频率)。


0
投票

我在VBA中使用它。有时我得到8976543566 ms,而不是40我在程序开始时通过两次调用来处理它:

如果gbolShowRunTime = True则

QueryPerformanceCounter curFrequencyStartLoop

如果结束

如果gbolShowBFTime = True则

QueryPerformanceCounter curFrequencyEndLoop'获取结束时间

QueryPerformanceCounter curFrequencyStartLoop'重新设置了种子

如果结束

此后工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.