为什么我不能在带有 Chrono 的 Windows 上让循环在C++中旋转不到一毫秒?
Why can't I get a loop to spin for less than a millisecond in C++ on Windows with Chrono?
>编辑:我正在使用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
免责声明:眼部汇编
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 与互斥锁相比,旋转锁可以保证上下文切换
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- nlohmann-json将一个数组插入到另一个数组中
- 有没有一种方法可以在编译时获得作用域类名
- 绘制旋转的三角形
- 为什么make_tie不是一件事
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- c++中O(n^(1/3))中一个数的除数的有效计数
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何允许用户选择何时停止三列中的每一列的旋转
- 为什么我不能在带有 Chrono 的 Windows 上让循环在C++中旋转不到一毫秒?
- 相机的旋转方向在一段时间后反转
- 在openGL或更具体的LWJGL中,一个人如何相对于相机旋转
- 如何围绕任意点旋转一组2D形状
- 在OpenGL 4.0中,是否有一种围绕局部坐标(即从模型视图矩阵)旋转的标准方法