Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Двойное использование 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top