gpt4 book ai didi

c++ - 在 std::chrono 时钟之间转换 time_points

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:20 24 4
gpt4 key购买 nike

这篇文章的标题实际上只是我问题的一半(较简单的一半)。因此,我将退一步谈谈我正在尝试做的事情。

使用 std::chrono 测量耗时非常容易。但是,到目前为止,我还没有看到任何“计时器”实现可以相当于秒表上的圈数。也就是说,当你想开始跟踪区间时你调用Timer.start(),而当你想要记录一个区间时调用Timer.tick()。然后,在快餐结束后,您可以回顾记录的时间间隔列表;可能会考虑平均值和 1% 的高点之类的。

另外,因为我经常使用它,所以我想任意询问计时器自午夜以来已经过去了多少微秒。

这个虚构类的构造函数的第一个任务是在内部设置午夜。最初,我是通过 this 中的技术来做到这一点的。精彩的答案。但是,当我开始实现我的 Timer 类概念时,我意识到我想使用 high_resolution_clocksteady_clock(即使 system_clock 在我的平台上使用纳秒间隔)。那么问题来了:如何将 chrono::steady_clock::time_point 设置为午夜?

只有 system_clockto_time_tfrom_time_t,据我所知,这是表达“今天午夜”的唯一方式"以 chrono 理解的方式。对于我昨晚的所有阅读,我找不到将 system_clock::time_point 转换为 steady_clock::time_point 的方法。我最近的尝试是:

typedef std::conditional<std::chrono::high_resolution_clock::is_steady,
std::chrono::high_resolution_clock,
std::chrono::steady_clock>::type TimerClock;

TimerClock::time_point midnight;

chrono::system_clock::time_point current_time = chrono::system_clock::now();

time_t raw_time = chrono::system_clock::to_time_t(current_time);

tm *tm_midnight = localtime(&raw_time);
tm_midnight->tm_hour = 0;
tm_midnight->tm_min = 0;
tm_midnight->tm_sec = 0;

midnight = chrono::system_clock::from_time_t(mktime(tm_midnight));

但显然那是行不通的。据我所知,chrono::time_point_cast 旨在让您从相同的时钟类型访问不同的分辨率。

这给我留下了两条路线/问题:

  • 我可以直接将 high_precision_clocksteady_clocktime_point 的值设置为“今天午夜”
  • 我可以将 system_clock::time_point 转换为与不同的 chrono 时钟一起使用吗?

当然,如果有人指出一种更好的方法来一起处理这一切,我会很高兴,如果它仍然符合我上面的总体目标的话。

提前致谢。 =)

最佳答案

根据系统时钟计算午夜。

在“同一时间”(大约)为系统时钟和您想要午夜的时钟获取一个时间点。将这个时间点称为 X。

将系统时钟的时间间隔从午夜转换为 X。转换为以皮秒为单位的持续时间(或任何分辨率)。

现在,对于您希望午夜开启的时钟上的时间点 X,您已经有了自午夜以来的时间(以皮秒为单位)。

请注意,这基本上是近似值,因为“时间 X”将与系统时钟和您关心的时钟分开。但它只会在计算时间戳所需的时间上有所不同。如果你真的很在意,你可以做两个系统时钟样本来制动目标时钟并平均自午夜以来的时间。

关于c++ - 在 std::chrono 时钟之间转换 time_points,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003364/

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