Моему приложению нужна абсолютная метка времени (т.е. включая дату и час) с ошибкой ниже 0,5 с. Сервер синхронизируется через NTP, но я все еще хочу обнаружить, не синхронизированы ли часы сервера по какой-либо причине.
Моя идея состоит в том, чтобы использовать устойчивые часы для проверки системных часов. Я предполагаю, что в течение, скажем, 1-часового стабильного времени часы должны очень мало отклоняться от реального времени (значительно ниже 0,5 с). Я сравниваю время, измеренное с постоянными и системными часами периодически. Если разница между этими двумя значениями увеличивается или увеличивается, это может означать, что 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 мкс, а в большинстве случаев - всего 1 мкс.