Я написал класс ниже, основанный на QueryPerformanceCounter. После выполнения некоторого вызова мне нужно подождать не менее 1, 5, 10 и т. Д. c. микросекунды. Однако в плане производительности я не хочу ждать дольше необходимого. Таким образом, желательна максимально возможная точность независимо от загрузки процессора. Приведенная ниже реализация просто продолжает опрашивать текущее время в al oop, измеряя прошедшее время, а затем прерывает работу, когда прошло достаточно времени. Но есть ли лучший способ добиться большей точности, исходя из этих требований? Нужно ли мне продолжать опрос частоты при каждом измерении? Хотя современные процессоры изменяют частоту динамически в зависимости от нагрузки и оптимизации энергопотребления, разве это не измерение тактовой частоты чипсета с фиксированной частотой? Я использую это на процессоре Intel Xeon 2012 года выпуска, Windows 7.
#include <windows.h>
namespace Timer {
class HighPercisionSleepTimer {
public:
HighPercisionSleepTimer() {
this->minwaittimeinmicroseconds = 0;
}
void setWaitTimeinMicroSeconds(int minwaittimeinmicroseconds) {
this->minwaittimeinmicroseconds = minwaittimeinmicroseconds;
}
void start() {
QueryPerformanceCounter(&StartingTime);
QueryPerformanceFrequency(&frequency);
}
void wait() {
LARGE_INTEGER ElapsedMicroseconds;
while (true) {
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= frequency.QuadPart;
if (ElapsedMicroseconds.QuadPart >= minwaittimeinmicroseconds) {
break;
}
}
}
private:
LARGE_INTEGER StartingTime, EndingTime, frequency;
LONGLONG minwaittimeinmicroseconds;
}; // End class HighPercisionSleepTimer
} // End namespace Timer