QueryPerformanceCounter выбрасывает неправильные номера

Я использую 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();
}

0

Решение

Вы предполагаете, что частота от счетчика производительности составляет ровно 1000000 Гц.

Вам нужно позвонить QueryPerformanceFrequency вместо этого, поскольку частота может варьироваться (некоторые ядра используют таймер 1,024 МГц материнской платы, другие используют счетчик меток времени ЦП, который работает приблизительно на тактовой частоте ЦП).

1

Другие решения


По вопросам рекламы [email protected]