JMH en Java: guía completa con ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

JMH (Java Microbenchmark Harness): Guía completa de micro-benchmarking en Java

JMH (Java Microbenchmark Harness) es una biblioteca para crear, ejecutar y analizar micro-benchmarks (pruebas de rendimiento a pequeña escala) en el lenguaje Java. Desarrollada por el equipo de JVM Performance (incluyendo a expertos como Alexey Shipilëv), JMH es el estándar de facto para medir el rendimiento de fragmentos pequeños de código en el ecosistema Java.

1. ¿Qué es y para qué sirve?

Escribir una prueba de rendimiento correcta en Java no es una tarea trivial. El compilador JIT, el recolector de basura, las optimizaciones a nivel de CPU (caché, ejecución especulativa) e incluso el orden de ejecución de las operaciones pueden distorsionar completamente los resultados. Un simple bucle for dentro de main a menudo provoca que el compilador JIT elimine el código bajo prueba por considerarlo "muerto" (Dead Code Elimination), y terminas midiendo la velocidad de un bucle vacío.

JMH resuelve estos problemas automáticamente. Gestiona el "calentamiento" (Warmup) del código para que el compilador JIT se estabilice, previene la optimización de "código muerto", maneja los forks (Forks) para aislar la JVM, y proporciona resultados estadísticamente significativos (media, percentiles, margen de error).

¿Para qué le sirve a un desarrollador? Para tomar decisiones informadas al elegir un algoritmo, una estructura de datos, un método de serialización, optimizar una sección crítica de código o comparar diferentes implementaciones (por ejemplo, StringBuilder vs String.concat). Sin JMH, corres el riesgo de "optimizar" algo que en realidad no es un cuello de botella, u obtener resultados que no se reproducen en un entorno de producción real.

2. Instalación

JMH es una biblioteca para Java, por lo que no se instala con pip o npm. La forma más cómoda es usar Maven o Gradle.

Opción 1: Maven (recomendado para empezar rápido)

Crea un nuevo proyecto Maven y añade lo siguiente a tu pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ejemplo</groupId>
    <artifactId>ejemplo-jmh</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>

Opción 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'
}

Opción 3: Descargar el JAR (no recomendado)

Puedes descargar el fat-jar desde GitHub, pero es menos práctico para gestionar dependencias.

3. Inicio rápido — ejemplo mínimo funcional

Recommendations