Предупреждение о вреде курения!
В этом посте описывается, как настроить и запустить простой тест 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 UnitsCompTestBenchmark.bmCustomComparator thrpt 20 2598.617 ± 67.634 ops/sCompTestBenchmark.bmJDKComparator thrpt 20 751.110 ± 14.835 ops/sCompTestBenchmark.bmNoVTLComparator thrpt 20 1348.750 ± 30.382 ops/sCompTestBenchmark.bmNoVTLOrAutoBoxingComparator thrpt 20 2202.995 ± 43.673 ops/s |
Существует огромное количество наворотов для точной настройки ваших тестов, которые я не буду здесь описывать, но, надеюсь, это поможет вам начать работу.
- Полный список кодов моего теста смотрите здесь .
| Ссылка: | JMH: Как настроить и запустить тест JMH от нашего партнера по JCG Дэниела Шая в блоге Rational Java . |