chrono: могу ли я проверить системные часы с устойчивыми часами на временной шкале часа? - PullRequest
0 голосов
/ 17 января 2020

Моему приложению нужна абсолютная метка времени (т.е. включая дату и час) с ошибкой ниже 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 мкс.

1 Ответ

0 голосов
/ 17 января 2020

Этот вопрос не имеет ничего общего с C ++.

1) Возможность работы этого метода зависит от точности внутренних часов вашего компьютера. Дешевые часы могут дрейфовать по минуте в день, что превышает 0.5se c в час.

2) Метод не может определить систематическое смещение c. Скажем, вы постоянно отстаете на секунду из-за задержки в сети, пинга или некоторых других проблем. В этом случае метод будет показывать незначительное отклонение.

По сути, он может только сказать, является ли измеренное время точным, но дает мало знаний о точности (Google: точность против точности). Кроме того, в комментариях были упомянуты вопросы общего порядка настройки часов go.

...