JMH - java Microbenchmark Harness
Микро-бенчмаркинг, который проверяет, хороша ли производительность определенного метода. Эта тестовая среда была выпущена в 2013 году, разработана разработчиками JLT и позже классифицирована как OpenJDK.
- Официальный сайт:откройте JDK.java.net/projects/co…
Что такое JMH, для чего он используется и как он используется? на основеideaиспользуется в.
Создать тест JMH
1. Создайте проект maven и добавьте зависимости.
1.1 jmh-core (ядро jmh) 1.2 mh-generator-annprocess (пакет обработки аннотаций)
<!--jmh依赖-->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.21</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.21</version>
<scope>test</scope>
</dependency>
2. идея установить плагин JMH плагин JMH
File->Settings->Plugins->JMH plugin
3. Откройте конфигурацию аннотации бегуна
Поскольку JMH использует аннотации при запуске
Эти настройки позволяют JMH обрабатывать аннотации: Компилятор -> Процессоры аннотаций -> Включить обработку аннотаций (галочка)
4. Определите класс, который необходимо протестировать
Вот смотри, я написал класс, программу, которая параллельно обрабатывает потоки, определил коллекцию списков, а потом закинул в эту коллекцию 1000 чисел.
Напишите метод, определяющий, является ли число простым или нет. Я написал два метода: первый — использовать forEach, чтобы определить, кто является простым числом в нашей 1000 чисел, второй — использовать потоки параллельной обработки. Этот метод forEach выполняется только в одном потоке, от начала до конца, от 0 до 1000, но при параллельной обработке будет несколько потоков, использующих ForkJoin для разделения числа на несколько частей для параллельной обработки. Один из них — последовательная обработка, а другой — параллельная обработка, обе из которых можно протестировать, но следует отметить, что этот эталонный тест не является сравнительным тестом, вы просто пытаетесь проверить его пропускную способность в такой ситуации. очень профессиональный инструмент тестирования. Строго говоря, эта часть специализируется на разработке тестов.
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Jmh {
static List<Integer> nums = new ArrayList<>();
static {
Random r = new Random();
for (int i = 0; i < 10000; i++) {
nums.add(1000000 + r.nextInt(1000000));
}
}
public static void foreach() {
nums.forEach(v -> isPrime(v));
}
static void parallel() {
nums.parallelStream().forEach(Jmh::isPrime);
}
static boolean isPrime(int num) {
for (int i = 2; i <= num / 2; i++) {
if (num % i == 0) return false;
}
return true;
}
}
5. Пишите модульные тесты
Этот тестовый класс должен находиться в тестовом пакете
Я тестирую этот метод testForEach, он очень простой, я просто вызываю foreach класса Jmh и тестирую его. Самое главное, что я добавил эту аннотацию @Benchmark, это аннотация JMH, она должна быть проанализирована и обработана JMH, Вот почему мы установили эту обработку аннотаций в настройках, очень просто, Вам нужно только добавить аннотации для микротестирования этого метода, щелкните правой кнопкой мыши, чтобы запустить его напрямую.
import org.openjdk.jmh.annotations.*;
public class JmhTest {
@Benchmark
@Warmup(iterations = 1, time = 3)//在专业测试里面首先要进行预热,预热多少次,预热多少时间
@Fork(5)//意思是用多少个线程去执行我们的程序
@BenchmarkMode(Mode.Throughput)//是对基准测试的一个模式,这个模式用的最多的是Throughput吞吐量
@Measurement(iterations = 1, time = 3)//是整个测试要测试多少遍,调用这个方法要调用多少次
public void testForEach() {
Jmh.foreach();
}
}
6. Запустите тестовый класс, если вы столкнулись со следующей ошибкой:
ОШИБКА: org.openjdk.jmh.runner.RunnerException: ОШИБКА: Исключение при попытке получить блокировку JMH (C:\WINDOWS/jmh.lock): доступ запрещен. , выход. Используйте -Djmh.ignoreLock=true для принудительного продолжения.
at org.openjdk.jmh.runner.Runner.run(Runner.java:216)
at org.openjdk.jmh.Main.main(Main.java:71)
Эта ошибка связана с тем, что JMH требуется доступ к системному каталогу TMP.Решение: Откройте «Конфигурация запуска» -> «Переменные среды» -> включите жизнеспособность системной среды (отметьте)конечный результат:
Основные понятия в JMH
- Warmup
Разминка, потому что в JVM есть оптимизации (локализация) для конкретного кода, разминка важна для результатов тестирования 2. Измерение Сколько тестов было проведено всего 3. Тайм-аут 4. Темы Количество потоков, указанное fork 5. Тестовый режим Режим сравнения 6. Ориентир Какой кусок кода тестировать
Это введение в JMH.Строго говоря, к нам это имеет мало отношения.Это то, чем занимается отдел тестирования, а вы
Недостатков не так уж много, чтобы решить эту проблему.Вы также знаете, что ваш метод эффективен или в конце концов.Вы можете использовать простой плагин JMH, чтобы помочь вам. Готово, вам не нужно писать это вручную. Если вы заинтересованы в JMH, он может быть вам полезен в вашей работе.Пожалуйста, ознакомьтесь с официальными примерами.Наверное,официальных примеров десятки. Примеры программ, вы можете изучить одну за другой самостоятельно. Официальный образец:Korea.open JDK.java.net/code-tools/…