【问题标题】:chrono steady_clock not giving correct result?chrono stable_clock 没有给出正确的结果?
【发布时间】:2015-11-12 04:25:50
【问题描述】:

我的应用服务器代码中有一行代码,它使用steady_clock 获取时间戳值,如下所示:

uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();

现在我们有两个系统 machineA 运行 Ubuntu 12 (gcc 4.6.3 compiler) 和 machineB 运行 Ubuntu 14 (gcc 4.8.2 compiler)

现在我们使用 another Ubuntu 12 VM (which has 4.7.3 compiler) 上的 make 编译我们的应用服务器代码,然后将生成的 tar 文件复制到 machineA 并启动我们的应用服务器。启动后,上面这行代码在machineA中打印出这样的值:

1439944652967

现在我们还使用 another Ubuntu 14 VM (which has 4.8.2 compiler) 上的 make 编译相同的应用服务器代码,然后将生成的 tar 文件复制到 machineB 并启动我们的应用服务器。启动后,上面这行代码在machineB中打印出这样的值:

10011360 

你看出区别了吗?我很困惑为什么会有这种区别,我无法理解?所有的代码和一切都是一样的。有没有人对此有任何解释,我该如何解决?

如果需要,我可以尝试添加一些调试代码,看看有什么问题来解决这个问题。

【问题讨论】:

    标签: c++ ubuntu gcc chrono


    【解决方案1】:

    恐怕有人对std::steady_clock 是什么感到困惑。

    time_since_epoch 给出自时钟开始以来的持续时间,不一定是 Unix 纪元。 steady_clock 只保证单调递增。这意味着steady_clock 将永远向前,永远不会减少。

    不能保证steady_clock 代表任何有意义的东西。它可以是自程序执行开始以来的持续时间,计算机已打开的持续时间,自最近的星期二以来的持续时间,或者只要它继续前进,几乎可以是任何东西。

    换句话说,steady_clock 实际上并不能告诉真实世界的时间。它只对测量时间的流逝有用。它的用途可能包括您有时间点 A 和时间点 B 并且您对它们之间的持续时间感到好奇的任何情况:基准测试、进度估计等。

    如果您正在寻找真实世界时间,您应该查看std::system_clock,这是一个代表系统时间(即操作系统时间)的时钟。它非常适合显示时间,但它对于测量差异非常无用,因为它不能保证是单调的,并且几乎可以肯定没有夏令时,用户调整他们的时钟,以及其他可能改变现实世界时间的事件。

    【讨论】:

    • 更笼统地说:“时间”告诉你现在几点,“时钟”只是滴答作响。
    • 不错的答案,但夏令时不会影响system_clocksystem_clock 通常跟踪 Unix 时间,这是 UTC 时区自 1970 年 1 月 1 日以来的非闰秒计数。
    • @HowardHinnant 不能保证跟踪 UTC unix 时间,我几乎可以肯定它可以感知 DST。根据标准:“system_clock 类的对象代表系统范围实时时钟的挂钟时间。” (无耻地从here 提出,因为我目前无法访问该标准)。 “挂钟时间”肯定会根据 DST 变化。
    • 你是对的,这就是我说“通常”的原因。我知道std::chrono::system_clock 的 3 个独立实现以及此处定义的所有 3 个轨道 Unix 时间:en.wikipedia.org/wiki/Unix_time
    • 这里是最新 C++ 工作草案的链接,如果您觉得有帮助的话:open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2012-08-30
    • 2016-04-15
    相关资源
    最近更新 更多