分辨率与刻度频率

resolution versus tick frequency

本文关键字:频率 分辨率      更新时间:2023-10-16

我的理解是

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

给出刻度频率,但如何确定时钟的分辨率?(在窗口下,此比率返回我1e-007

例如,在windows下,high_resolution_clocksystem_clocktypedef,每15毫秒一次,精度为100µs,而boost::chrono high_resolution_clocksteady_clocktypedef,我如何确定其分辨率?

解决此类问题的最佳方法是进行测试。此信息无法通过<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的类型别名。