Что не так с System.nanoTime? - PullRequest
       28

Что не так с System.nanoTime?

1 голос
/ 22 ноября 2011

У меня очень длинная строка с шаблоном </value> в самом конце, я пытаюсь проверить производительность некоторых вызовов функций, поэтому я сделал следующий тест, чтобы попытаться выяснить ответ ... но я думаю, что я могу использовать nanoTime неправильно? Потому что результат не имеет смысла, как бы я ни менял порядок ...

  long start, end;

  start = System.nanoTime();
  StringUtils.indexOf(s, "</value>");
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  s.indexOf("</value>");      
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  sb.indexOf("</value>");
  end = System.nanoTime();
  System.out.println(end - start);

Я получаю следующее:

163566    // StringUtils
395227    // String
30797     // StringBuilder

165619    // StringBuilder
359639    // String
32850     // StringUtils

Независимо от того, в каком порядке я их поменяю, цифры всегда будут примерно одинаковыми ... Что здесь за дело?

Из FAQ сайта java.sun.com:

Использование System.nanoTime () между различными точками в коде для выполнения измерений прошедшего времени всегда должно быть точным.

Также:

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Разница между двумя прогонами составляет порядка микросекунд, и это ожидается.На вашем компьютере происходит много вещей, которые делают среду выполнения никогда не одинаковой между двумя запусками вашего приложения.Вот почему вы получаете эту разницу.

РЕДАКТИРОВАТЬ: Java API говорит:

Этот метод обеспечивает точность наносекунды, но не обязательно точность наносекунды .

1 голос
/ 22 ноября 2011

Более чем вероятно, что проверяемые вами методы используют какой-то общий код за кулисами.Но JIT выполнит свою работу только после примерно 10.000 вызовов.Следовательно, это может быть причиной того, что ваши первые два примера кажутся всегда медленнее.

Быстрое исправление: просто выполните 3 вызова метода перед первым измерением длинной длинной строки.

1 голос
/ 22 ноября 2011

Скорее всего, при запуске JVM возникают проблемы с инициализацией памяти или другие вещи, которые искажают ваши цифры. Вы должны получить большую выборку, чтобы получить более точные цифры. Поиграйте с заказом, запустите его несколько раз и т. Д.

...