JMH Microbenchmarking Starter Case

Java

JMH - java Microbenchmark Harness

Микро-бенчмаркинг, который проверяет, хороша ли производительность определенного метода. Эта тестовая среда была выпущена в 2013 году, разработана разработчиками JLT и позже классифицирована как OpenJDK.

Что такое 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

  1. Warmup

Разминка, потому что в JVM есть оптимизации (локализация) для конкретного кода, разминка важна для результатов тестирования 2. Измерение Сколько тестов было проведено всего 3. Тайм-аут 4. Темы Количество потоков, указанное fork 5. Тестовый режим Режим сравнения 6. Ориентир Какой кусок кода тестировать

Это введение в JMH.Строго говоря, к нам это имеет мало отношения.Это то, чем занимается отдел тестирования, а вы

Недостатков не так уж много, чтобы решить эту проблему.Вы также знаете, что ваш метод эффективен или в конце концов.Вы можете использовать простой плагин JMH, чтобы помочь вам. Готово, вам не нужно писать это вручную. Если вы заинтересованы в JMH, он может быть вам полезен в вашей работе.Пожалуйста, ознакомьтесь с официальными примерами.Наверное,официальных примеров десятки. Примеры программ, вы можете изучить одну за другой самостоятельно. Официальный образец:Korea.open JDK.java.net/code-tools/…