System.nanoTime () в Windows XP - PullRequest
       0

System.nanoTime () в Windows XP

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

Я только что нашел System.currentTimeMillis не является точным на Windows XP, теперь я попытался System.nanoTime() с тем же кодом.

Поскольку 1ms = 1,000,000ns, так что я думаю, что результат долженбыть 15,000,000ns, но это не так.

См. пример кода:

public class NanoTime {
    public static void main(String[] args) {
        long start = 0;
        long end = 0;
        while (true) {
            if (start == 0) {
                start = System.nanoTime();
            } else {
                long current = System.nanoTime();
                if (current != start) {
                    end = current;
                    break;
                }
            }
        }
        System.out.println("The time interval of your OS: " + (end - start) + "ns");
    }
}

Результат:

The time interval of your OS: 655ns

Кажется, это намного лучше, чем System.currentTimeMillis(),Но почему?Можем ли мы поверить в этот результат?

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

Если в вашей Windows XP установлен пакет обновления 3 (SP3), вы можете поверить, что в результате ... в Windows JVM реализует nanoTime() внутренне , используя QueryPerformanceCounter/QueryPerformanceFrequency API, который в основном находится в HAL (уровне абстрагирования оборудования) ииспользует некоторые внутренние * CPU интервалы инструкции, которые довольно точны ... это хорошо только для измерений интервалов НЕ для обработки времени ...

Для более сложнойописание см. http://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks и http://juliusdavies.ca/posix_clocks/clock_realtime_linux_faq.html

РЕДАКТИРОВАТЬ - согласно комментарию:

Вышеупомянутая функция используется самой JVM внутри системы, когда nanoTime называется, который абсолютно НИЧЕГО не имеет отношения к JNI - они не подвержены Java-коду!

РЕДАКТИРОВАТЬ 2 - согласно комментариям:

nanoTime() - этоправильный инструмент для точного измерения истекшего времени , в то время как currentTimeMillis - правильный инструмент для обработки абсолютного времени .

4 голосов
/ 22 октября 2011

Почему?

Потому что он не пытается быть таким же точным.

Из Javadocs:

Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного или настенного времени.

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

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

Лучший способ узнать, что делает метод - это прочитать его javadoc . Не гадать, что он делает, используя эксперименты.

Возвращает текущее значение наиболее точного доступного системного таймера, в наносекундах.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...