【问题标题】:resolution versus tick frequency分辨率与滴答频率
【发布时间】:2014-11-06 09:10:52
【问题描述】:

我的理解是这样的

std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den;

给出滴答频率,但我如何确定时钟的分辨率? (windows下这个比例回我1e-007

例如在 windows 下high_resolution_clocksystem_clocktypedef,每~15ms 以100µs 的精度滴答一次,而boost::chrono high_resolution_clocksteady_clocktypedef,我如何确定它的分辨率?

【问题讨论】:

    标签: c++ time


    【解决方案1】:

    解决此类问题的最佳方法是进行测试。此信息无法通过 <chrono> API 获得,并且通常不会记录在案。

    一个测试可能会从一个预先分配的数组中的时钟中收集大量时间戳,然后对该集合进行某种统计分析。例如,下面是一个测试,它找出连续调用 Clock::now() 之间的平均、最小和最大报告持续时间。

    #include "date/date.h"
    #include <iostream>
    #include <vector>
    
    template <class Clock>
    void
    test()
    {
        auto warm_up = Clock::now();
        (void)warm_up;
        std::vector<typename Clock::time_point> v(100'000);
        for (auto& t : v)
            t = Clock::now();
        auto m = Clock::duration::max();
        auto M = Clock::duration::zero();
        for (auto i = 1; i < v.size(); ++i)
        {
            auto delta = v[i] - v[i-1];
            if (m > delta)
                m = delta;
            if (M < delta)
                M = delta;
        }
        using date::operator<<;
        std::cout << "Average delta between calls is "
                  << (v.back() - v.front())/(double)(v.size()-1) << '\n';
        std::cout << "Minimum delta between calls is " << m << '\n';
        std::cout << "Maximum delta between calls is " << M << '\n';
    }
    
    int
    main()
    {
        test<std::chrono::system_clock>();
    }
    

    "date/date.h" 标头仅用于更轻松地打印持续时间,而无需手动发现其单位。您可以通过自己格式化持续时间来修改此测试以不使用"date/date.h"

    我编译了这个:

    clang++ -std=c++17 test.cpp -I../date/include -O3 -Wall
    

    在 macOS 上运行 3 次,得到:

    Average delta between calls is 0.049440µs
    Minimum delta between calls is 0µs
    Maximum delta between calls is 40µs
    
    Average delta between calls is 0.048790µs
    Minimum delta between calls is 0µs
    Maximum delta between calls is 45µs
    
    Average delta between calls is 0.047210µs
    Minimum delta between calls is 0µs
    Maximum delta between calls is 38µs
    

    那是给system_clock。换成steady_clock我得到了:

    Average delta between calls is 56.912339ns
    Minimum delta between calls is 43ns
    Maximum delta between calls is 26973ns
    
    Average delta between calls is 63.223292ns
    Minimum delta between calls is 45ns
    Maximum delta between calls is 79589ns
    
    Average delta between calls is 55.261153ns
    Minimum delta between calls is 44ns
    Maximum delta between calls is 21786ns
    

    我没有费心为high_resolution_clock 运行测试,因为此时钟是此平台上steady_clock 的类型别名。

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2016-06-08
      • 2014-08-24
      • 2013-08-20
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2022-01-27
      相关资源
      最近更新 更多