Синхронизировать виртуальную машину Java с System.nanoTime - PullRequest
2 голосов
/ 13 октября 2011

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

Я имею в виду:

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

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

спасибо!

Ответы [ 3 ]

8 голосов
/ 13 октября 2011

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

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

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

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

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

0 голосов
/ 13 октября 2011

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

Это сильно затрудняет сравнение nanoTime на двух машинах.

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

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

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

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

0 голосов
/ 13 октября 2011

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

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

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

...