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