分辨率与滴答频率

Gui*_*e07 5 c++ time

我的理解是

std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den;
Run Code Online (Sandbox Code Playgroud)

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

例如windows下high_resolution_clocktypedefsystem_clock它与蜱的为100μs精度每15毫秒〜,同时boost::chrono high_resolution_clocktypedefsteady_clock,我怎么能确定它的分辨率是多少?

How*_*ant 2

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

\n\n

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

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

使用“date/date.h”标头只是为了更轻松地打印持续时间,而无需手动发现其单位。您可以修改此测试以不使用“date/date.h”您可以通过自行格式化持续时间

\n\n

我用以下方法编译了这个:

\n\n
clang++ -std=c++17 test.cpp -I../date/include -O3 -Wall\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 macOS 上运行 3 次,得到:

\n\n
Average delta between calls is 0.049440\xc2\xb5s\nMinimum delta between calls is 0\xc2\xb5s\nMaximum delta between calls is 40\xc2\xb5s\n\nAverage delta between calls is 0.048790\xc2\xb5s\nMinimum delta between calls is 0\xc2\xb5s\nMaximum delta between calls is 45\xc2\xb5s\n\nAverage delta between calls is 0.047210\xc2\xb5s\nMinimum delta between calls is 0\xc2\xb5s\nMaximum delta between calls is 38\xc2\xb5s\n
Run Code Online (Sandbox Code Playgroud)\n\n

那是为了system_clock. 更改为steady_clock我得到:

\n\n
Average delta between calls is 56.912339ns\nMinimum delta between calls is 43ns\nMaximum delta between calls is 26973ns\n\nAverage delta between calls is 63.223292ns\nMinimum delta between calls is 45ns\nMaximum delta between calls is 79589ns\n\nAverage delta between calls is 55.261153ns\nMinimum delta between calls is 44ns\nMaximum delta between calls is 21786ns\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有费心运行测试,因为high_resolution_clock这个时钟是一个类型别名steady_clock

\n