Предупреждение о вреде курения!
В этом посте описывается, как настроить и запустить простой тест 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 . |