为什么我不能在带有 Chrono 的 Windows 上让循环在C++中旋转不到一毫秒?

Why can't I get a loop to spin for less than a millisecond in C++ on Windows with Chrono?

本文关键字:旋转 一毫 循环 不能 Chrono 为什么 Windows C++      更新时间:2023-10-16

>编辑:我正在使用VS2013和Windows 7。

使用下面的代码,我希望能够有至少一微秒的时间差,但是,当执行时,它会将其构建到至少 1000 微秒(一毫秒(。我无法获得低于一毫秒的时间的原因是什么?有什么办法吗?

// SleepTesting.cpp : Defines the entry point for the console application.
//
#include <chrono>
#include "windows.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
FILETIME startFileTime, endFileTime;
uint64_t ullStartTime, ullEndTime;
bool sleep = true;
auto start = std::chrono::system_clock::now();
auto now = std::chrono::system_clock::now();
auto elapsedTime = std::chrono::duration_cast<std::chrono::microseconds>(now - start);
GetSystemTimeAsFileTime(&startFileTime);
ullStartTime = static_cast<uint64_t>(startFileTime.dwHighDateTime) << 32 | startFileTime.dwLowDateTime;
while (sleep)
{
now = std::chrono::system_clock::now();
elapsedTime = std::chrono::duration_cast < std::chrono::microseconds > (now - start);
if (elapsedTime.count() > 0)
{
sleep = false;
}
}
GetSystemTimeAsFileTime(&endFileTime);
ullEndTime = static_cast<uint64_t>(endFileTime.dwHighDateTime) << 32 | endFileTime.dwLowDateTime;
uint64_t timeDifferenceHundredsOfNano = ullEndTime - ullStartTime;
std::cout << "Elapsed time with Chrono library: " << elapsedTime.count() << " micro-seconds" << std::endl;
std::cout << "Elapsed time with Windows.h FILETIME: " << timeDifferenceHundredsOfNano << " hundreds of nanoseconds" << std::endl;
return 0;
}

由于您使用的是system_clock,我认为您无法在Windows 7上获得微秒分辨率(至少从我所看到的情况来看(。 尝试高分辨率时钟,但即使这样也并不总是有效,因为Windows甚至不能保证两个连续操作之间经过的时间少于一毫秒,即使没有睡眠。

> IIRC 在VS2013中,system_clock(和highres_clock(以时钟周期为单位,即ms。如果你需要更高的分辨率,你可以转到所有Windows并查看QueryPerformanceCounter。

LARGE_INTEGER startCount;
LARGE_INTEGER endCount;
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&startCount);
{...}
QueryPerformanceCounter(&endCount);
double startTimeInMicroSec = startCount.QuadPart * (1000000.0 / frequency.QuadPart);
double endTimeInMicroSec = endCount.QuadPart * (1000000.0 / frequency.QuadPart);
// endTimeInMicroSec - startTimeInMicroSec

免责声明:眼部汇编