2009-05-04 2 views
2

Прежде всего, я должен признать, что это очень простые и примитивные вопросы ... Я хочу продемонстрировать различные алгоритмы в Java для сортировки и поиска и получить значение для среды выполнения. Там вы вопросы, которые я не могу решить:Java task runtime

  1. есть Hotspot компилирование - который является оптимизация выполнения Мне нужно отключить (я думаю).

  2. Как получить временные значения (секунды) для времени выполнения? Запуск таймера перед исполнением и его остановка ... кажется немного примитивным. И сам таймер-объект потребляет время выполнения ... Мне нужно избегать этого.

Есть ли что-нибудь в Java API, которое можно было бы использовать для решения этих проблем?

Спасибо, Клаус

ответ

1
  1. Использование -Xint JVM flag. Другие варианты можно увидеть here.

  2. Используйте API ThreadMXBean, чтобы получить время работы процессора/пользователя для вашей темы. Пример можно увидеть here.

5

Вы можете отключить HotSpot с -Xint в командной строке, чтобы получить порядок убывания величины производительности. Однако почему вы не хотите измерять производительность в реальном мире? Когда вы компилируете, разные вещи могут стать узкими местами.

Вообще для microbenchmarks:

  • использования System.nanoTime, чтобы получить измерение времени в начале и в конце
  • пробега в течение разумного промежутка времени
  • сделайте измерение несколько раз в течение (есть некоторые «разогрев»)
  • не чередуют измерения разных алгоритмов
  • не делают ввода-вывода в измеренном сегменте
  • использовать результат (HotSpot может полностью оптимизировать на тривиальные операции)
  • сделать это в реальной ситуации в мире (или cloae как можно)
  • запомнить двухъядерный является нормой, и больше ядер станет нормальным
1

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

В целом я бы предложил не делать вещи более сложными, чем вам нужно.

Чтобы иметь встроенное отопление, я часто игнорирую первые 10% -20% итераций. Что-то вроде

long start; 
int count; 
for(int i = -count/5; i < count; i++) { 
    if (count == 0) start = System.nanoTime(); 
    // do tested code 
} 
long time = System.nanoTime() - start; 
long average = time/count; 
System.out.printf("Average time was %,d micro-seconds%n", average/1000);