Является ли System.nanoTime () полностью бесполезным? - PullRequest
149 голосов
/ 04 февраля 2009

Как указано в сообщении в блоге Остерегайтесь System.nanoTime () в Java , в системах x86 Java. System.nanoTime () возвращает значение времени, используя CPU специфический счетчик. Теперь рассмотрим следующий случай, который я использую для измерения времени звонка:

long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;

Теперь в многоядерной системе после измерения времени1 поток может быть назначен другому процессору, чей счетчик меньше, чем у предыдущего процессора. Таким образом, мы можем получить значение в time2, которое на меньше , чем time1. Таким образом мы бы получили отрицательное значение в timeSpent.

Учитывая этот случай, не правда ли, что System.nanotime пока бесполезен?

Я знаю, что изменение системного времени не влияет на nanotime. Это не проблема, которую я описал выше. Проблема в том, что каждый ЦП будет держать свой счетчик, так как он был включен. Этот счетчик может быть ниже на втором процессоре по сравнению с первым процессором. Поскольку ОС может планировать поток на второй процессор после получения time1, значение timeSpent может быть неправильным и даже отрицательным.

Ответы [ 15 ]

2 голосов
/ 04 февраля 2009

Нет, это не так ... Это зависит только от вашего процессора, проверьте Высокоточный таймер событий , чтобы узнать, как / почему вещи обрабатываются по-разному в зависимости от процессора.

По сути, прочитайте исходный код Java и проверьте, что ваша версия делает с функцией, и если она работает с процессором, вы будете его запускать.

IBM даже предлагает использовать его для сравнения производительности (публикация 2008 г., но обновленная).

1 голос
/ 21 сентября 2011

Java является кроссплатформенной, а nanoTime зависит от платформы. Если вы используете Java - когда не используйте nanoTime. Я нашел реальные ошибки в разных реализациях jvm с этой функцией.

0 голосов
/ 20 августа 2015

Кроме того, System.currentTimeMillies() изменяется при изменении системных часов, а System.nanoTime() - нет, поэтому последний безопаснее измерять длительности.

0 голосов
/ 24 апреля 2012

nanoTime крайне небезопасно для синхронизации. Я опробовал его на моих основных алгоритмах тестирования простоты, и он дал ответы, которые были буквально на расстоянии одной секунды для одного и того же ввода. Не используйте этот нелепый метод. Мне нужно что-то более точное и точное, чем Миллис времени, но не так плохо, как nanoTime.

0 голосов
/ 04 февраля 2009

Документация по Java 5 также рекомендует использовать этот метод для той же цели.

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

Java 5 API Doc

...