#java #nanotime
#java #nanotime
Вопрос:
У меня есть поток, который помещает данные в очередь, и другой поток, который считывает данные из очереди и обрабатывает их. Я хотел бы проверить, как долго данные находятся в очереди перед обработкой.
Я добавил параметр времени (рассчитанный с использованием System.nanoTime()
) в данные перед отправкой первым потоком. Как только второй поток обработает его, он вычислит System.nanoTime()
и найдет разницу с предыдущим временем, установленным в данных.
Будет ли это работать правильно? Я спрашиваю об этом, потому что я вижу отрицательную разницу в журналах.
Обновить
Я хотел бы уточнить, что время запуска устанавливается процессом на другом компьютере, а разница вычисляется на другом компьютере.
Комментарии:
1. очередь расположена на одной машине? разве вы не можете вместо этого измерить время в очереди?
2. Очередь находится в redis. Как мы можем измерить время в очереди?
Ответ №1:
Я использовал System.nanoTime() между потоками и процессами. На одной машине он является глобальным и монотонно увеличивается (за исключением многосетевой Windows XP)
Если вы видите отрицательную разницу, скорее всего, это ошибка в вашем коде.
Вы можете видеть nanoTime () между машинами, но вам нужно учитывать разницу и смещение между часами. (И вы можете получить очень большие отрицательные результаты, если не выполните это исправление)
время запуска устанавливается процессом на другой машине, а разница вычисляется на другой машине.
Между машинами вам нужно либо
- используйте System.currentTimjeMillis(), который обычно с точностью до миллисекунды с помощью NTP.
- используйте System.nanoTime() для обхода, т. Е. Отправьте сообщение из ro B, а другое обратно в A. Исходя из этого, можно оценить время прохождения половины цикла.
- используйте System.nanoTime() не для определения времени истечения, а для обнаружения дрожания. Это предполагает, что большую часть времени задержка является приемлемой (скажем, 10-100 микросекунд), но иногда она намного выше, чем обычно. Я использую этот класс, чтобы помочь обнаружить дрожание. RunningMinimum
Если вас интересуют только многомиллионные задержки, я бы использовал currentTimeMillis()
Комментарии:
1. Я думаю, что это именно то, с чем я столкнулся. Не могли бы вы объяснить, как настроить разницу между машинами?
2. Я не думаю, что есть какой-то смысл пытаться заставить
nanoTime
работать на разных машинах и даже между процессами, это работает только случайно (не обязательно для работы).3. Существует ли какой-либо другой механизм для определения прошедшего времени на разных машинах?
4. @cppcoder вы не можете найти прошедшее время, если вы не используете currentTimeMillis или не рассчитываете время в оба конца. т.Е. Вы отправляете nanoTime на машину, которая отправляет его обратно. Я использую его для обнаружения сообщений с дрожанием / задержкой, и для этого nanoTime получает точность около 10 микросекунд, чего для меня достаточно. т. Е. Вы не знаете, какова задержка, но вы не намного, задержка выше, чем обычно. Класс выполняется минимально github.com/OpenHFT/Chronicle-Core/blob/master/src/main/java/net /…