Рубрики
Без рубрики

Написание микропленок с помощью JMH

Эта статья представляет собой краткое введение в JMH, инструмент, предоставляемый OpenJDK для обработки микропленок. С пометкой java, программирование, производительность, бенчмарк.

Сегодня я хотел бы поговорить о предмете, который меня волнует: производительность. Я собираюсь дать краткий обзор аспекта, который не часто рассматривается: микробенчмаркинг. Мы увидим, как мы можем реализовать микро-бенчмаркинг с помощью инструмента JMH.

Зачем использовать микро-бенчмаркинг и почему JMH?

Когда мы занимаемся программированием, нам часто хочется быстро оценить производительность алгоритма, полезного метода или любого компонента, который мы пишем или используем. То, что мы часто делаем, – это пишем простой код в очень простом основном классе, вызываем тест, который мы хотим проверить, и измеряем время выполнения вызова с помощью системных часов. К сожалению, это очень точный подход, и единственный случай, когда он может быть достаточным показателем, – это когда он явно показывает очень низкую производительность. Этот вид тестирования производительности слишком отличается от контекста, в котором мы хотим выполнять наш производственный код:

  • такая единичная мера очень подвержена ошибкам и не может предоставить достоверную статистику
  • простые тесты с несколькими исполнениями не могут воспользоваться преимуществами оптимизации JVM, такими как компилятор JIT (Just in Time), который компилирует часто выполняемый байт-код в машинный код для оптимизации продолжительности выполнения. Такие оптимизации могут быть применены только после многочисленных вызовов, чтобы компилятор JIT мог обнаружить возможные выгоды.
  • трудно воспроизвести производственную среду с многопоточным параллельным доступом и всем тем влиянием, которое это может оказать на производительность Чтобы решить эти проблемы, проект OpenJDK разработал инструмент, посвященный тестам для языков, работающих на JVM, под названием JMH. Эта платформа предназначена для автоматического повторного выполнения нашего кода, моделирования производственного контекста и сбора статистики о производительности кода. Конечно, JMH можно использовать с официальным JDK от Oracle, а не только с установкой OpenJDK.

Настройка проекта

Доступен архетип JMH Maven, что позволяет очень легко настроить проект с помощью командной строки:

архетип mvn: генерировать .openjdk.jmh – ява -эталон-архетип .cs – дмх .0

Модуль будет содержать все необходимые зависимости и плагины Maven, а также будет создан класс My Benchmark по умолчанию. Этот класс будет содержать пустой аннотированный метод. Как и многие другие Java-фреймворки, JMH использует аннотации. Эталонные классы похожи на классы модульных тестов, которые мы пишем каждый день (Я надеюсь, что вы это сделаете! 😉 ) Выполнение тестов (имеется в виду выполнение классов, помеченных @Benchmark) требует создания нашего проекта Maven с помощью хорошо известной команды:

чистая установка mvn Затем нам просто нужно выполнить сгенерированный файл jar: java -jar target/benchmarks.jar

Это запустит серию итераций (непрерывное выполнение нашего кода в течение заданной продолжительности) и сгенерирует отчет в конце.

Пример использования

Давайте рассмотрим простой случай использования, который всем известен: объединение строк внутри цикла. Мы сравним наивную реализацию с использованием оператора + для строковых объектов и использование StringBuilder:

Этот очень простой тест показывает средние числа операций (выполнение нашего контрольного кода) для каждого метода в течение всего времени, а также другие статистические данные, такие как минимальное/максимальное/среднее значение, стандартное отклонение и 99-й процентиль…

Рассмотрение более сложных дел

После реализации очень простого бенчмарка JMH с использованием параметров выполнения по умолчанию мы увидим, как мы можем настроить наши бенчмарки. Как объяснялось в начале этой статьи, JMH стремится обеспечить выполнение, близкое к производственному контексту. Это достигается с помощью настройки некоторых параметров, таких как:

  • количество итераций
  • продолжительность каждой итерации
  • тип эталона (мы можем, например, измерить количество выполнений за определенный промежуток времени или среднее время выполнения)
  • количество потоков, которые будут использоваться для имитации одновременного доступа
  • количество экземпляров JVM, на которых мы хотим выполнить наши тесты, и их параметры
  • количество итераций прогрева, которые должны быть выполнены в каждом сценарии. Эти итерации не отображаются в вычисленной статистике, но это очень полезная функция, когда мы хотим получить представление о поведении нашего кода после того, как JIT-компилятор оптимизирует его Это не исчерпывающий список функций JMH. Если вы хотите углубиться, я приглашаю вас взглянуть на многочисленные примеры его [официальной документации] официальная документация .

Вывод

JMH – очень полезный и мощный инструмент для создания, выполнения и мониторинга нашего кода с помощью микро-тестов. Это очень интересный подход, который дополняет более традиционные тесты производительности, такие как нагрузочное тестирование. Это может дать нам очень ценные данные о некоторых точных частях нашего кода. Как и в модульных тестах, чем более разделен код, подлежащий тестированию, тем проще написание тестов, и результаты также будут более точными! Вы можете найти источники этой статьи на мой репозиторий Github

Оригинал: “https://dev.to/schreiber_chris/writing-microbenchmarks-with-jmh”