Resolution of std::chrono::high_resolution_clock doesn#39;t correspond to measurements(std::chrono::high_resolution_clock 的分辨率与测量值不对应)
问题描述
让我通过这个测试程序问我的问题:
Let me ask my question by this test program:
#include <iostream>
#include <chrono>
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
int main(int argc, char* argv[])
{
std::cout
<< "Resolution (nano) = "
<< (double) std::chrono::high_resolution_clock::period::num /
std::chrono::high_resolution_clock::period::den *
1000 * 1000 * 1000
<< std::endl;
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << "How many nanoseconds does std::cout take?" << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
auto diff = t2-t1;
nanoseconds ns = duration_cast<nanoseconds>(diff);
std::cout << "std::cout takes " << ns.count() << " nanoseconds"
<< std::endl;
return 0;
}
我机器上的输出:
分辨率(纳米)= 100
Resolution (nano) = 100
std::cout 需要多少纳秒?
How many nanoseconds does std::cout take?
std::cout 需要 1000200 纳秒
std::cout takes 1000200 nanoseconds
我收到 1000200
或 1000300
或 1000400
或 1000500
或 1000600
或 2000600
结果(= 1 或 2 微秒).很明显,要么std::chrono
的分辨率不是 100纳秒或者我测量std时间的方式::cout
是错误的.(为什么我从来没有收到 1 到 2 微秒之间的信息,例如 1500000
?)
I receive either 1000200
or 1000300
or 1000400
or 1000500
or 1000600
or 2000600
as a result (= 1 or 2 microsecond). Obviously, either the resolution of std::chrono
is not 100 nano-seconds or the way I measure the time of std::cout
is wrong. (Why do I never receive something between 1 and 2 microseconds, for example 1500000
?)
我需要一个高分辨率的 C++ 计时器.操作系统本身提供了一个高分辨率计时器,因为我能够在同一台机器上使用 C# Stopwatch
类以微秒精度测量事物.所以我只需要正确使用操作系统拥有的高分辨率计时器!
I need a high-resolution timer in C++. The OS itself provides a high-resolution timer, because I'm able to measure things with microsecond-precision using the C# Stopwatch
class on the same machine. So I would just need to correctly use the high-resolution timer that the OS has!
如何修复我的程序以产生预期的结果?
How do I fix my program to produce the expected results?
推荐答案
我猜您正在使用 Visual Studio 2012.如果不是,请忽略此答案.Visual Studio 2012 typedef
的 high_resolution_clock
到 system_clock
.可悲的是,这意味着它的精度很差(大约 1 毫秒).我写了一个更好的高分辨率时钟,它使用 QueryPerformanceCounter
在 Visual Studio 2012 中使用...
I'm going to guess you are using Visual Studio 2012. If not, disregard this answer. Visual Studio 2012 typedef
's high_resolution_clock
to system_clock
. Sadly, this means it has crappy precision (around 1 ms). I wrote a better high-resolution clock which uses QueryPerformanceCounter
for use in Visual Studio 2012...
HighResClock.h:
struct HighResClock
{
typedef long long rep;
typedef std::nano period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<HighResClock> time_point;
static const bool is_steady = true;
static time_point now();
};
HighResClock.cpp:
namespace
{
const long long g_Frequency = []() -> long long
{
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
return frequency.QuadPart;
}();
}
HighResClock::time_point HighResClock::now()
{
LARGE_INTEGER count;
QueryPerformanceCounter(&count);
return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
}
(我省略了断言和 #ifs 以查看它是否在 Visual Studio 2012 上从上述代码编译.)
(I left out an assert and #ifs to see if it's being compiled on Visual Studio 2012 from the above code.)
您可以在任何地方使用此时钟,使用方式与标准时钟相同.
You can use this clock anywhere and in the same way as standard clocks.
这篇关于std::chrono::high_resolution_clock 的分辨率与测量值不对应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:std::chrono::high_resolution_clock 的分辨率与测量值不对应
基础教程推荐
- 从 std::cin 读取密码 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01