JMH (Java Microbenchmark Harness): Guia completo de micro-benchmarking em Java
JMH (Java Microbenchmark Harness) é uma biblioteca para criar, executar e analisar micro-benchmarks (testes de performance em pequena escala) na linguagem Java. Desenvolvida pela equipe JVM Performance (incluindo especialistas como Alexey Shipilëv), o JMH é o padrão de facto para medir o desempenho de pequenos trechos de código no ecossistema Java.
1. O que é e para que serve?
Criar um teste de performance correto em Java é uma tarefa desafiadora. O compilador JIT, o garbage collector, otimizações em nível de processador (cache, execução especulativa) e até a ordem de execução das operações podem distorcer completamente os resultados. Um simples loop for dentro do main frequentemente faz com que o compilador JIT elimine o código testado como "morto" (Dead Code Elimination), e você acaba medindo a velocidade de um loop vazio.
O JMH resolve esses problemas automaticamente. Ele gerencia o "aquecimento" (Warmup) do código para estabilizar o compilador JIT, previne a otimização de "código morto", gerencia forks para isolar a JVM e fornece resultados estatisticamente significativos (média, percentis, margem de erro).
Para que serve um desenvolvedor? Para tomar decisões fundamentadas ao escolher um algoritmo, estrutura de dados, método de serialização, otimizar um trecho crítico de código ou comparar diferentes implementações (por exemplo, StringBuilder vs String.concat). Sem o JMH, você corre o risco de "otimizar" algo que não é um gargalo real ou obter resultados que não se reproduzem em produção.
2. Instalação
JMH é uma biblioteca para Java, portanto não é instalada via pip ou npm. A maneira mais conveniente é usar Maven ou Gradle.
Método 1: Maven (recomendado para início rápido)
Crie um novo projeto Maven e adicione ao pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.exemplo</groupId>
<artifactId>jmh-exemplo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jmh</packaging>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.37</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.37</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Método 2: Gradle
plugins {
id 'java'
id 'me.champeau.jmh' version '0.7.2'
}
dependencies {
implementation 'org.openjdk.jmh:jmh-core:1.37'
annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.37'
}
jmh {
jmhVersion = '1.37'
}
Método 3: Baixar JAR (não recomendado)
Você pode baixar o fat-jar do GitHub, mas isso é menos prático para gerenciar dependências.