chrono:我可以在一个小时的时间尺度上用稳定时钟验证系统时钟吗?

问题描述 投票:0回答:1

我的应用程序需要绝对时间戳(即包括日期和小时),且误差小于0.5s。服务器通过NTP同步,但是我仍然想检测服务器时钟是否由于某种原因没有很好地同步。

我的想法是使用稳定的时钟来验证系统时钟。我假设在1个小时内,稳定时钟应与实际时间相差很小(远低于0.5s)。我定期比较稳定时钟和系统时钟的测量时间。如果两者之间的差异增大或增大很大,则可能表明NTP正在调整系统时钟,这可能意味着某些时间值不正确。

这是示例代码:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
  const int test_time = 3600; //seconds, approximate
  const int delay = 100; //milliseconds
  const int iterations = test_time * 1000 / delay;

  int64_t system_clock = std::chrono::system_clock::now().time_since_epoch().count();
  int64_t steady_clock = std::chrono::steady_clock::now().time_since_epoch().count();
  const int64_t offset = system_clock - steady_clock;

  for(int i = 0; i < iterations; i++) {
    system_clock = std::chrono::system_clock::now().time_since_epoch().count();
    steady_clock = std::chrono::steady_clock::now().time_since_epoch().count();
    int64_t deviation = system_clock - offset - steady_clock;

    std::cout<<deviation/1e3<<" µs"<<std::endl;

    /**
     * Here I put code making use of system_clock
     */

    std::this_thread::sleep_for(std::chrono::milliseconds(delay));
  }
}

此程序有意义吗?我尤其不确定稳定时钟的稳定性。我认为由于内部服务器时钟的不完善性,它可能仅会略有偏差,但也许我遗漏了什么?

我对上面代码的测试结果感到非常惊讶。即使我将其设置为运行8小时,我看到的最大偏差也仅为–22µs,在大多数情况下仅为1µs。

c++ time timestamp chrono
1个回答
0
投票

此问题与C ++无关。

1)此方法是否有机会起作用,取决于计算机内部时钟的准确性。便宜的时钟每天可能漂移一分钟-每小时超过0.5秒。

2)该方法无法识别系统偏移。假设您由于网络滞后,ping或其他一些问题而经常落后一秒钟。在这种情况下,该方法显示的偏差可以忽略不计。

[基本上,它只能告诉您所测量的时间是否准确,但对准确度的了解很少(google:准确度与准确度)。在评论中还提到了有关常规时钟调整的算法问题。

© www.soinside.com 2019 - 2024. All rights reserved.