Время выполнения задачи Java - PullRequest
2 голосов
/ 04 мая 2009

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 04 мая 2009

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

Обычно для микробенчмарков:

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

Использование 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);
1 голос
/ 04 мая 2009
  1. Использовать -Xint флаг JVM. Другие варианты можно увидеть здесь .

  2. Используйте API ThreadMXBean для получения времени CPU / User для вашего потока. Пример можно увидеть здесь .

...