首页 > 解决方案 > 使用 std::chrono 的时间戳 - 如何根据相对时间“过滤”数据?

问题描述

我想对我产生的数据流进行时间标记,我想为此使用std::chrono::steady_clock

这些时间戳与数据一起存储(作为 uint64 值的数组?),我稍后需要再次处理这些时间戳。

现在,到目前为止,我还没有使用过 std::chrono 库,所以我确实需要一些关于这个库的语法和最佳实践的帮助。

我可以使用以下方法获取和存储值:

uint64_t timestamp = std::chrono::steady_clock::now().time_since_epoch().count();

但我如何做到最好:

上述代码片段将不胜感激。

我想将上述三个基本上结合起来执行以下操作:拥有一个(增加的)时间戳值数组(如 uint64),我想截断它,以使所有数据“早于”最后一个时间戳减去 X 秒被扔掉。

标签: c++timechrono

解决方案


让我们看看您可能在 chrono 的 cppreference 文档中使用的功能

首先,您需要决定要使用哪个时钟。有steady_clock你建议的,high_resolution_clocksystem_clock

high_resolution_clock是依赖于实现的,所以除非我们真的需要它,否则让我们把它收起来。保证是单调的steady_clock,但不能保证您获得的值的含义。它非常适合对事件进行排序或测量它们的间隔,但您无法从中获得时间点。

另一方面,system_clock有一个含义,它是 UNIX 纪元,因此您可以从中获取时间值,但不能保证是单调的。

要获取 a 的期间(一个刻度的持续时间)steady_clock,您有period成员:

auto period = std::chrono::steady_clock::period();
std::cout << "Clock period " << period.num << " / " << period.den << " seconds" << std::endl;
std::cout << "Clock period " << static_cast<double>(period.num) / period.den << " seconds" << std::endl;

假设您想使用steady_clock值过滤在最后几秒钟内发生的事件,您首先需要计算所需时间段内的滴答数并将其从now. 类似于以下内容:

std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t t_c = std::chrono::system_clock::to_time_t(now - std::chrono::seconds(10));

t_c用作截止点。

但是,不要靠std::chrono::steady_clock::now().time_since_epoch().count();得到有意义的东西——只是一个数字。的时期steady_clock通常是启动时间。如果你需要时间,你应该使用system_clock(记住那不是单调的)。

C++20a 引入了更多时钟,可以转换为时间。


推荐阅读