gpt4 book ai didi

c++ - 分辨率与滴答频率

转载 作者:太空狗 更新时间:2023-10-29 23:03:00 24 4
gpt4 key购买 nike

我的理解是

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,我如何确定它的分辨率?

最佳答案

解决此类问题的最佳方法是进行测试。此信息无法通过 <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"使用 header 只是为了更容易打印出持续时间,而无需手动发现它们的单位。您可以将此测试修改为不使用 "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 的类型别名在这个平台上。

关于c++ - 分辨率与滴答频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com