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_point
s 穿过闰秒插入点,并且您绝对需要计算插入的闰秒(或其一小部分)。
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_point
s 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
.