Синхронизировать виртуальную машину Java с System.nanoTime

Имеет ли смысл синхронизировать виртуальные машины Java с System.nanoTime ()?

Я имею в виду:

  • Вызов System.nanoTime () и помещает результаты в t1
  • Отправить пакет B
  • когда пакет от A получен на B, B вызывает System.nanoTime () и отправляет результат A
  • когда пакет от B получен на A, A вызывает System.nanoTime () и помещает результаты в t3, помещает время, полученное в пакете от B, в t2
  • сдвиг по времени = (t3 - t1) / 2 - t2

правильно ли использовать System.nanoTime для этого?

Спасибо!

3 ответа

правильно ли использовать System.nanoTime для этого?

Нет. System.nanoTime() полезно только для измерения разницы во времени в одной JVM, а не в абсолютном времени для нескольких JVM.

Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного или настенного времени. Возвращаемое значение представляет наносекунды с некоторого фиксированного, но произвольного времени начала (возможно, в будущем, поэтому значения могут быть отрицательными). Один и тот же источник используется всеми вызовами этого метода в экземпляре виртуальной машины Java; другие экземпляры виртуальной машины могут использовать другое происхождение.

Чтобы решить эту проблему, в общем, вы бы использовали System.currentTimeMillis(), но это все еще ограничено часами ОС двух компьютеров. Используйте NTP для синхронизации времени между компьютерами.

См. Синхронизация времени между сервером и Интернетом с использованием Java.

System.nanoTime() относится к произвольному и неопределенному моменту времени. Из того, что я наблюдал, похоже, что оно работало на компьютере.

Это делает сравнение nanoTime на двух машинах очень сложным.

timeshift = (t3 + t1) / 2 - t2; // note the + instead of -

Формула, которую вы использовали, может быть использована для аппроксимации разницы между двумя машинами, но она может показать огромную разницу. Один из способов обойти это - выполнить это 1000 раз и взять среднее или среднее значение, что дало мне стабильный результат в прошлом.

Эта цифра должна регулярно обновляться, так как даже температура может ускорить или замедлить нано-таймер.

Примечание. Удивительно трудно удерживать две машины с точностью до миллисекунды.;)

Не совсем понятно, чего вы пытаетесь достичь.

Если вы пытаетесь синхронизировать часы, для этого есть специальные протоколы, такие как NTP. nanoTime() в любом случае это бесполезно, так как его значения не сравнимы между JVM.

Если вы пытаетесь измерить задержку, то неоднократно измеряйте туда-обратно (t3-t1) и разделить на два. За это, nanoTime() действительно может быть использован.

Другие вопросы по тегам