steady_clock和system_clock之间的区别?

时间:2015-07-22 01:03:10

标签: c++ c++11 timestamp

我试图通过查看数据的时间戳来查看我的数据是否是120秒,所以我有以下代码:

uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
bool is_old = (120 * 1000 < (now - data_holder->getTimestamp()));

在上面的代码data_holder->getTimestamp()中是uint64_t,它以毫秒为单位返回时间戳。

现在当我打印出now变量值时,我看到了这个10011360,当我打印出data_holder->getTimestamp()1437520382241时,现在和数据持有者的区别时间戳应该是负面的吗?为什么它会像下面的日志中显示的那样积极?

2015-07-21 16:13:02,530 WARN 0x7f35312d1700 data_check - now value: 10011360 , data holder timestamp: 1437520382241 , difference: 18446742636199180735

我的上述代码是否正确?从上面的数据持有者时间戳,它看起来不是120秒的旧数据,所以我觉得我的代码有问题吗?因为如果我将数据持有者时间戳转换为实际时间(使用epoch转换器),然后将其与日志时间进行比较,如上所示,它几乎相同。

我正在使用steady_clock,如上所示。我需要在这里使用system_clock吗?在外行术语中steady_clocksystem_clock之间有什么区别。我在Ubuntu 14.04框上运行此代码。

4 个答案:

答案 0 :(得分:1)

  1. steady_clock使用系统启动时间作为时代,system_clock 使用1970-1-1 00:00作为其纪元,因此无法进行任何数学运算 在他们之间,这没有任何意义。

  2. 在对2个无符号整数进行任何减法之前,请 确保被摄对象大于次要捕捉对象。

答案 1 :(得分:0)

首先要做的事情

您看到正值的原因是无符号整数环绕。试试这个,看看:

std::cout << static_cast <uint64_t> (-1) << std::endl;

预期getTimestamp()返回的值是多少?如果没有,在没有看到getTimestamp()的实现的情况下,有点难以看清错误。看起来时间戳没有使用相同的时钟进行测量。

稳定与系统时间

稳定时钟最适合测量时间间隔。引用cppreference.com

  

类std :: chrono :: steady_clock表示单调时钟。物理时间向前移动时,此时钟的时间点不会减少。此时钟与挂钟时间无关,最适合测量间隔。

与system_clock相反,system_clock不是单调的(例如,如果用户改变主机上的时间,则时间会减少。)

答案 2 :(得分:0)

第一个问题,负整数将隐式转换为uint64_t类型的整数,成为一个巨大的正整数。

第二个问题,system_clock是一个系统范围的实时时钟,如果你修改了系统时间,那么system_clock的返回时间就会改变。 steady_clock是一个物理时间,因此你无法改变它。

答案 3 :(得分:0)

也许,最显着的区别是std::chrono:system_clock的起始时刻是01.01.1970,即所谓的UNIX-epoch。另一方面,对于std::chrono::steady_clock,通常是PC的启动时间,它最适合用于测量间隔。

相关问题