提问者:小点点

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


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

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

据我所知,C++chrono库中有三种不同的时钟,还有两种C-style时钟:

上面所描述的每一项任务的利弊是什么?


共1个答案

匿名用户

是与UTC(不包括闰秒)同步的时钟。每隔一段时间(也许一天几次),它会被少量调整,以保持它与正确的时间一致。这通常是通过网络服务(如NTP)来完成的。这些调整通常以微秒为单位,但在时间上可以向前或向后调整。这个时钟的时间戳实际上有可能(虽然不太可能也不常见)以微小的量向后倒退。除非被管理员滥用,不会按总金额跳转,例如由于夏令时或更改计算机的本地时区,因为它总是跟踪UTC。

就像秒表。它与任何时间标准都没有关系。它一直在滴答作响。它的时间可能不是很完美(没有一个时钟是真的)。但绝不会调整,特别是不会向后调整。它非常适合对短代码进行计时。但是由于它从未被调整过,因此它可能会随着时间的推移而相对于漂移,而是被调整为与UTC保持同步的。

这可以归结为以下事实:最适合对短持续时间进行计时。它通常还具有纳秒分辨率,尽管这不是必需的。最适合对“长”时间进行计时,因为“长”非常模糊。当然,几个小时或几天都算“长”,一秒钟以下的时间就不算“长”了。如果您需要将时间戳与人类可读的时间(例如民用日历上的date/time)相关联,是唯一的选择。

允许作为的类型别名,实际上总是这样。但有些平台别名为,有些平台别名为。因此,最好直接选择,这样您就知道您得到的是什么。

虽然没有指定,但通常限制为一秒的分辨率。因此它完全不能用于需要亚秒精度的情况。否则跟踪UTC(不包括闰秒),就像一样。

跟踪处理器时间,而不是物理时间。也就是说,当您的线程不忙着做某事,而操作系统已将其驻留时,的测量值将不会反映在停机期间的时间增长。如果这是您需要测量的,那么这将非常有用。如果您在使用它时没有意识到您正在测量的是处理器时间,那么这将是非常令人惊讶的。

C++20将另外四个时钟添加到/code>库:

就像一样,只是它计算闰秒。当您需要减去跨越闰秒插入点的两个

测量自1958-01-01 00:00:00以来的秒数,并在此日期的UTC之前偏移10秒。它没有闰秒,但是每把闰秒插入到UTC中,TAI和UTC的历法表示就会再偏离一秒。

对GPS时间系统进行建模。它从世界协调时1980年1月的第一个星期日00:00:00算起,以秒为单位。与TAI一样,每向UTC插入一个闰秒,GPS和UTC的历法表示就会再发散一秒。由于GPS和TAI处理UTC闰秒的方式相似,GPS的历法表示总是落后于TAI 19秒。

库使用的时钟,它产生了由别名的

可以在C++20中使用一个名为的新的命名cast,在之间进行转换。例如:

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

的类型是基于,其类型(精度)与相同。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(用于|记录|时间|戳|c++|时钟|优缺点)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?