分辨率与刻度频率
resolution versus tick frequency
我的理解是
std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den;
给出刻度频率,但如何确定时钟的分辨率?(在窗口下,此比率返回我1e-007
)
例如,在windows下,high_resolution_clock
是system_clock
的typedef
,每15毫秒一次,精度为100µs,而boost::chrono high_resolution_clock
是steady_clock
的typedef
,我如何确定其分辨率?
解决此类问题的最佳方法是进行测试。此信息无法通过<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
的类型别名。
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 在指针的帮助下,文本文件中单词的频率
- 函数计算用户按下按钮的频率
- 在条件变量中触发错误信号的频率是多少
- 使用分辨率定理用Z3证明
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- Opencv 恢复到比我设置的更高的分辨率
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 如何在 c++ 中循环中使用频率变化的声音?
- C/C++ 位数组分辨率转换算法
- Windows 和 Linux 之间的相对路径分辨率差异?
- 查找给定范围内最长连续 1 的频率
- 字母 字母频率
- 如何在C++中为高分辨率时钟声明变量?
- 给定数字的浮点分辨率
- WM_PAINT消息频率:C#(.Net Framework 4.7.2 WinForms)与C++
- 过载分辨率和用户定义的转换
- 创建一个函数,返回给定单词在C++中的频率
- std::chrono 似乎没有提供准确的时钟分辨率/频率
- 分辨率与刻度频率