Точное измерение времени в Java

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

17
задан jjnguy 30 September 2009 в 22:20
поделиться

4 ответа

The problem with getting super precise time measurements is that some processors can't/don't provide such tiny increments.

As far as I know, System.currentTimeMillis() and System.nanoTime() is the best measurement you will be able to find.

Note that both return a long value.

16
ответ дан 30 November 2019 в 13:34
поделиться

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

Не только это, но и в зависимости от того, как эта функция фактически реализована ОС, вы все равно можете обнаружить квантованные результаты (например, ответы, которые всегда заканчиваются на 64 или 128 вместо промежуточных значений).

Это Также стоит отметить, что цель метода - найти две разницы во времени между некоторым (близким) временем начала и текущим моментом; Если вы возьмете System.nanoTime () в начале долго работающего приложения, а затем возьмете System.nanoTime () долгое время спустя, он может уйти довольно далеко от реального времени. Таким образом, вы должны действительно использовать его только для периодов менее 1 секунды; если вам нужно более длительное время работы, достаточно миллисекунд. (А если нет, то составьте последние несколько чисел; вы, вероятно, впечатляете клиентов, и результат будет таким же достоверным.)

если вам нужно более длительное время работы, достаточно миллисекунд. (А если нет, то составьте несколько последних чисел; вы, вероятно, впечатляете клиентов, и результат будет таким же достоверным.)

если вам нужно больше времени, достаточно миллисекунд. (А если нет, то составьте несколько последних чисел; вы, вероятно, впечатляете клиентов, и результат будет таким же достоверным.)

5
ответ дан 30 November 2019 в 13:34
поделиться

К сожалению, я не думаю, что java RTS на данный момент достаточно развита.

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

  • Определенные действия сборщика мусора блокируют все потоки, даже если вы выполняете параллельный сборщик мусора.
  • По умолчанию точность тактового сигнала в Linux составляет всего 10 мс. Java не может сделать его лучше, если ядро ​​linux не поддерживает.

Я не понял, как обратиться к №1, если вашему приложению не нужно делать сборку мусора. Приличное приложение среднего размера, вероятно, иногда тратит десятки миллисекунд на паузы сборщика мусора. Вам, вероятно, не повезло, если ваше требование к точности меньше 10 мс.

Что касается пункта 2, Вы можете настроить ядро ​​linux для большей точности. Однако вы также получаете меньше из своей коробки, потому что теперь контекст ядра переключается чаще.

Возможно, нам стоит взглянуть на это под другим углом. Есть ли причина, по которой OPS требует точности на 10 мс ниже? Можно ли сказать оператору, что точность составляет 10 мс, И также посмотреть журнал GC в это время, чтобы они знали, что время составляет + -10 мс без активности GC примерно в это время?

чтобы они знали, что время составляет + -10 мсек без активности GC примерно в это время?

чтобы они знали, что время составляет + -10 мсек без активности GC примерно в это время?

1
ответ дан 30 November 2019 в 13:34
поделиться

Если вы хотите записать какое-то явление порядка наносекунд, вам действительно нужна операционная система реального времени . Точность таймера будет в значительной степени зависеть от реализации в операционной системе таймера с высоким разрешением и соответствующего оборудования.

Однако вы все равно можете использовать Java, поскольку доступны версии ОСРВ.

0
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: