我的应用程序需要绝对时间戳(即包括日期和小时),且误差小于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 ++无关。
1)此方法是否有机会起作用,取决于计算机内部时钟的准确性。便宜的时钟每天可能漂移一分钟-每小时超过0.5秒。
2)该方法无法识别系统偏移。假设您由于网络滞后,ping或其他一些问题而经常落后一秒钟。在这种情况下,该方法显示的偏差可以忽略不计。
[基本上,它只能告诉您所测量的时间是否准确,但对准确度的了解很少(google:准确度与准确度)。在评论中还提到了有关常规时钟调整的算法问题。