Синхронизировать виртуальную машину 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()
действительно может быть использован.