用于记录时间戳的不同 C++ 时钟的优缺点是什么?

2023-12-02

打印日志时,我希望每条消息都有一个时间戳,测量自程序启动以来的时间。最好以纳秒为单位,尽管毫秒也可以:

(  110 ns) Some log line 
( 1220 ns) Another log line 
( 2431 ns) Now for some computation...
(10357 ns) Error!

据我了解,C++ chrono 库中有三种不同的时钟和另外两种 C 风格的时钟:

  • std::chrono::高分辨率时钟
  • std::chrono::system_clock
  • std::chrono::steady_clock
  • 标准::时间
  • 标准::时钟

对于上述任务,每种方法的优点和缺点是什么?


system_clock是一个与 UTC 保持时间(不包括闰秒)的时钟。每隔一段时间(也许一天几次),它就会进行少量调整,以使其与正确的时间保持一致。这通常通过 NTP 等网络服务来完成。这些调整通常为微秒量级,但可以在时间上向前或向后。实际上,该时钟的时间戳有可能(尽管不太可能也不常见)向后移动少量。除非被管理员滥用,system_clock不会因夏令时或更改计算机本地时区等原因而大幅跳跃,因为它始终跟踪 UTC。

steady_clock就像秒表一样。它与任何时间标准都没有关系。它只是一直滴答作响。它可能无法保持完美的时间(没有时钟真的能保持完美的时间)。但它永远不会调整,尤其不会向后调整。它非常适合对短代码进行计时。但由于它永远不会被调整,它可能会随着时间的推移而漂移system_clock进行调整以与 UTC 保持同步。

这归结为以下事实:steady_clock最适合计时较短的时间。它通常还具有纳秒分辨率,但这不是必需的。和system_clock最适合计时“长”时间,其中“长”非常模糊。但当然,几小时或几天就可以算作“长”,而一秒以下的持续时间则不算。如果您需要将时间戳与人类可读的时间(例如民用日历上的日期/时间)相关联,system_clock是唯一的选择。

high_resolution_clock允许作为以下任一类型的类型别名steady_clock or system_clock,并且在实践中总是如此。但有些平台别名为steady_clock和一些system_clock。所以恕我直言,最好直接选择steady_clock or system_clock这样你就知道你会得到什么。

虽然没有具体说明,std::time通常限制为秒的分辨率。所以对于需要亚秒级精度的情况完全无法使用。否则std::time跟踪 UTC(不包括闰秒),就像system_clock.

std::clock跟踪处理器时间,而不是物理时间。也就是说,当您的线程不忙于做某事并且操作系统已将其停放时,测量std::clock不会反映停机期间时间的增加。如果这就是您需要测量的内容,这可能非常有用。如果您在使用它时没有意识到您正在测量的是处理器时间,那可能会非常令人惊讶。

C++20 的新功能

C++20 又添加了四个时钟<chrono>图书馆:

utc_clock就像system_clock,除了它计算闰秒。当您需要减去两个时,这主要有用time_points 穿过闰秒插入点,并且您绝对需要计算插入的闰秒(或其一小部分)。

tai_clock测量自 1958-01-01 00:00:00 以来的秒数,并在该日期比 UTC 提前 10 秒。它没有闰秒,但每次将闰秒插入 UTC 时,TAI 和 UTC 的日历表示法就会相差一秒。

gps_clock对 GPS 时间系统进行建模。它测量自 1980 年 1 月第一个星期日 00:00:00 UTC 以来的秒数。与 TAI 一样,每次在 UTC 中插入闰秒,GPS 和 UTC 的日历表示法就会相差一秒。由于 GPS 和 TAI 处理 UTC 闰秒的方式相似,因此 GPS 的历法表示总是落后 TAI 19 秒。

file_clock是所使用的时钟filesystem图书馆,并且是产生chrono::time_point别名为std::filesystem::file_time_type.

人们可以在 C++20 中使用一种新的命名强制转换,称为clock_cast之间进行转换time_points of system_clock, utc_clock, tai_clock, gps_clock and file_clock。例如:

auto tp = clock_cast<system_clock>(last_write_time("some_path/some_file.xxx"));

的类型tp is a system_clock-based time_point与相同的duration类型(精度)为file_time_type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于记录时间戳的不同 C++ 时钟的优缺点是什么? 的相关文章

随机推荐