c++ - std::chrono::high_resolution_clock 的分辨率与测量值不对应

标签 c++ visual-studio-2012 c++11 chrono

让我通过这个测试程序问我的问题:

#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

我收到 100020010003001000400100050010006002000600 作为结果(= 1 或 2 微秒)。显然,std::chrono 的分辨率不是 100 纳秒我测量 std 时间的方式: :cout 是错误的。 (为什么我从来没有收到 1 到 2 微秒之间的信息,例如 1500000?)

我需要一个高分辨率的 C++ 计时器。操作系统本身提供了一个高分辨率计时器,因为我能够在同一台机器上使用 C# Stopwatch 类以微秒精度测量事物。所以我只需要正确使用操作系统的高分辨率计时器!

如何修复我的程序以产生预期的结果?

最佳答案

我猜你正在使用 Visual Studio 2012。如果不是,请忽略此答案。 Visual Studio 2012 typedefhigh_resolution_clocksystem_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/

相关文章:

c++ - mingw windows找不到Eigen头文件

javascript - 在浏览器中运行 TypeScript 项目

c# - 如何单步执行 lambda 表达式

vb.net - Visual Studio 2012 对象浏览器未使用的引用

c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?

c++ - 高效的 const char* 连接和输出到 std::string

c++ - 库不是只有标题的原因是什么?

c++ - 监听时出现 Winsock 错误 10022

c++ - SQLite 查询返回 "unknown error"

c++ - 在 C++11 中有选择地禁用模板成员的简单方法