Сравнение значений System.nanoTime (), полученных на разных компьютерах - PullRequest
4 голосов
/ 03 ноября 2011

Правильно ли сравнивать два значения, полученные в результате вызова System.nanoTime () на двух разных машинах?Я бы сказал нет, потому что System.nanoTime () возвращает время с точностью до наносекунды относительно некоторого произвольного момента времени, используя Счетчик отметок времени (TSC) , который зависит от процессора.Я прав, есть ли способ (в Java), чтобы захватить момент на двух разных машинах и сравнить (безопасно) эти значения с точностью не менее микросекунды или даже с точностью до нанометра?

* 1006не решение, потому что оно не возвращает линейно увеличивающееся количество временных меток.Пользователь или службы, такие как NTP, могут изменить системные часы в любое время, и время будет прыгать вперед и назад.

Ответы [ 4 ]

3 голосов
/ 04 ноября 2011

Возможно, вы захотите изучить различные алгоритмы синхронизации часов .Очевидно, протокол Precision Time может дать вам с точностью до микросекунды в локальной сети.

Если вам не нужно определенное значение времени, а, скорее, вы хотите знать порядок различных событийВы можете, например, использовать метки времени Lamport .

0 голосов
/ 04 ноября 2011

Вы можете синхронизировать время с текущим временем в миллис. Однако даже если вы используете NTP, это может дрейфовать от 1 мс до 10 мс между машинами. Единственный способ обеспечить микросекундную синхронизацию между компьютерами - использовать специальное оборудование.

nanoTime гарантированно определяется одинаково или имеет одинаковое разрешение в двух разных ОС.

0 голосов
/ 04 ноября 2011

Вы не можете использовать nanoTime между двумя разными машинами.Для Java API документов :

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

Нет никакой гарантии, что nanoTime относительно любой временной базы.

0 голосов
/ 04 ноября 2011

Это зависит от процессора и операционной системы Q. Если посмотреть на часы POSIX, например, есть метки времени с высокой точностью времени суток (например, CLOCK_REALTIME возвращает значение времени нано эпохи) и метки времени произвольной времени высокой точности (например, CLOCK_MONOTONIC) (NB: разница между этими двумя хорошо объяснена в этом ответе ).

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

Достаточно ли для вас NTP зависит от того, что вы пытаетесь измерить.Например, если вы пытаетесь измерить интервал в несколько сотен микросхем (например, ящики, подключенные к одному и тому же коммутатору), тогда ваши результаты будут грубыми, с другой стороны, экстремальный NTP может быть очень хорошим, если ваши серверы находятся в совершенно разных географических точках.(например, от Лондона до Нью-Йорка), что означает, что эффект синхронизации часов (если он еще не далеко) затоплен задержкой между точками.

ПОКАЗАТЬ, что JNI, необходимый для доступа к таким часам из Java, довольно тривиален.

...