让我通过这个测试程序问我的问题:
#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;
}
我的机器上的输出:
Resolution (nano) = 100
How many nanoseconds does std::cout take?
std::cout takes 1000200 nanoseconds
我收到 1000200
或 1000300
或 1000400
或 1000500
或 1000600
或 2000600
作为结果(= 1 或 2 微秒)。显然,std::chrono
的分辨率不是 100 纳秒或我测量 std 时间的方式: :cout
是错误的。 (为什么我从来没有收到 1 到 2 微秒之间的信息,例如 1500000
?)
我需要一个高分辨率的 C++ 计时器。操作系统本身提供了一个高分辨率计时器,因为我能够在同一台机器上使用 C# Stopwatch
类以微秒精度测量事物。所以我只需要正确使用操作系统的高分辨率计时器!
如何修复我的程序以产生预期的结果?
最佳答案
我猜你正在使用 Visual Studio 2012。如果不是,请忽略此答案。 Visual Studio 2012 typedef
的 high_resolution_clock
到 system_clock
。可悲的是,这意味着它的精度很差(大约 1 毫秒)。我编写了一个更好的高分辨率时钟,它使用 QueryPerformanceCounter
在 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 上从上述代码编译。)
您可以在任何地方以与标准时钟相同的方式使用此时钟。
关于c++ - std::chrono::high_resolution_clock 的分辨率与测量值不对应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16299029/