c++ - 使用 std::chrono 的时间戳 - 如何根据相对时间“过滤”数据?
问题描述
我想对我产生的数据流进行时间标记,我想为此使用std::chrono::steady_clock。
这些时间戳与数据一起存储(作为 uint64 值的数组?),我稍后需要再次处理这些时间戳。
现在,到目前为止,我还没有使用过 std::chrono 库,所以我确实需要一些关于这个库的语法和最佳实践的帮助。
我可以使用以下方法获取和存储值:
uint64_t timestamp = std::chrono::steady_clock::now().time_since_epoch().count();
但我如何做到最好:
在读取数据时,从 uint64 创建一个时间点?
获取 stable_clock 的每秒滴答数 (uint64) 值?
查找位于给定时间点之前某个时间(以秒为单位)的“截止”时间点(如 uint64)?
上述代码片段将不胜感激。
我想将上述三个基本上结合起来执行以下操作:拥有一个(增加的)时间戳值数组(如 uint64),我想截断它,以使所有数据“早于”最后一个时间戳减去 X 秒被扔掉。
解决方案
让我们看看您可能在 chrono 的 cppreference 文档中使用的功能。
首先,您需要决定要使用哪个时钟。有steady_clock
你建议的,high_resolution_clock
和system_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 引入了更多时钟,可以转换为时间。
推荐阅读
- android - 为什么在 Android 上使用 Dagger2 时不显示数据
- javascript - React Native:如何根据陀螺仪传感器输出计算 x、y 和 z 轴旋转角度?
- android - 我收到“错误膨胀类 com.google.android.material.navigation.NavigationView”
- javascript - 如何从 Crystal Reports 执行位于数据库中的脚本
- reactjs - 在反应上下文中动态设置项目以显示时间线
- python - 创建新列导致 NaN
- elasticsearch - 哪个时间序列数据库支持这些特定要求?
- java - Sql 使用前一天的日期
- php - 如何在 phpoffice/phpword 中格式化 PreserveText
- c++ - 在这种情况下,std::push_heap 是否适用于 O(n) 复杂度而不是 O(logN)?