繁体   English   中英

std::chrono::system_clock 与 std::chrono::high_resolution_clock 行为

[英]std::chrono::system_clock vs std::chrono::high_resolution_clock behavior

考虑以下代码片段:

#include <chrono>
#include <cassert>

int main()
{
     auto result1 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now().time_since_epoch());
     auto result2 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch());
     assert((result2.count() - result1.count()) < 10);
}

我期望两个值之间的计数差异应该是最小的(最好小于一秒)。 但是在 VS2015 中,计数的差异是数十亿秒的数量级。 这怎么可能?

它为您断言的原因是因为high_resolution_clock被允许(并且通常确实)具有与system_clock不同的纪元。

system_clock的纪元是从 1970-01-01 00:00:00 UTC 开始测量时间的事实标准(未指定但可移植),忽略闰秒1

high_resolution_clock没有事实上的标准。 在 gcc high_resolution_clocksystem_clock的 typedef,在 gcc 平台上,你会注意到完美的同步。 在VS)和libc(++ high_resolution_clock是一个typedef为steady_clock

对我来说, steady_clock的时代是计算机启动时。

这是<chrono>的视频教程。 它涵盖了很多问题,包括这个问题,大约一个小时。


1 system_clock事实标准已成为 C++20 的官方标准。

system_clock类型的对象表示来自系统范围实时时钟的挂钟时间。 sys_time<Duration>类型的对象测量自 1970-01-01 00:00:00 UTC 以来的时间,不包括闰秒。 此度量通常称为Unix 时间 此度量有助于sys_time和日历类型 ([time.cal]) 之间的有效映射。 [示例: sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()0s
sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()946'684'800s ,即10'957 * 86'400s — 结束示例]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM