Статьи

JMH: как настроить и запустить тест JMH

Предупреждение о вреде курения!

В этом посте описывается, как настроить и запустить простой тест JMH. Микро-тесты, как известно, трудно получить правильные, и даже если вы все сделаете правильно (используя такие инструменты, как JMH), они все еще могут вводить в заблуждение. Тот факт, что ваш код выполняется определенным образом в крайне изолированной искусственной ситуации, не означает, что он будет работать таким же образом в вашем рабочем коде. Чтобы назвать лишь несколько проблем, в реальной программе кэш-память ЦП будет подвержена давлению со стороны других частей вашего кода, любое создание объекта будет иметь последующий эффект для GC, и JIT может иметь встроенный и скомпилированный код из других частей вашего кода. код, который конфликтует с кодом, который вы тестировали. Тем не менее, у микропроцессоров есть свое место, и если вы собираетесь их выполнять, вы также можете сделать их правильно с JMH.

В недавнем посте меня попросили выполнить мои тесты в качестве теста производительности JMH.

JMH — это инструмент Java для создания, запуска и анализа нано / микро / милли / макро тестов, написанных на Java и других языках, предназначенных для JVM. Смотрите полную документацию здесь .

Помимо прочего, JMH великолепен, потому что он заботится о итерациях разогрева, разветвляя процессы JVM, чтобы эталонные тесты не мешали друг другу, сопоставляя результаты и представляя их затем единообразно. И есть намного больше.

Я много слышал о JMH и видел много результатов JMH, но сам никогда не запускал. Это было удивительно легко! Вот как я это сделал.

Добавьте эти зависимости в ваш файл Maven pom.xml:

01
02
03
04
05
06
07
08
09
10
<dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.5.1</version>
</dependency>

Затем решите, какие методы вы хотите сравнить, и добавьте к ним аннотацию @Benchmark. Если вам нужен какой-либо код инициализации, добавьте его в метод, который должен быть помечен как @Setup.

Самый простой способ запустить тест — это добавить эту реализацию в ваш основной метод. (Смотрите здесь другие способы запуска ваших тестов).

1
2
3
4
5
6
7
8
public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(MyBenchmark.class.getSimpleName())
                .forks(1)
                .build();
 
        new Runner(opt).run();
}

Затем просто запустите, как любую обычную программу, и вы получите все совершенство JMH!

В качестве примера, чтобы увидеть формат теста JMH, вот как выглядели мои результаты:

1
2
3
4
5
Benchmark                                         Mode  Cnt     Score    Error  Units
CompTestBenchmark.bmCustomComparator             thrpt   20  2598.617 ± 67.634  ops/s
CompTestBenchmark.bmJDKComparator                thrpt   20   751.110 ± 14.835  ops/s
CompTestBenchmark.bmNoVTLComparator              thrpt   20  1348.750 ± 30.382  ops/s
CompTestBenchmark.bmNoVTLOrAutoBoxingComparator  thrpt   20  2202.995 ± 43.673  ops/s

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

  • Полный список кодов моего теста смотрите здесь .
Ссылка: JMH: Как настроить и запустить тест JMH от нашего партнера по JCG Дэниела Шая в блоге Rational Java .