0Pricing
Java Academy · Lección

Por qué usar JMH

Evite errores ingenuos en los benchmarks

Por qué usar JMH es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Por qué JMH

Java Microbenchmark Harness (JMH) es la herramienta estándar para medir el rendimiento de pequeñas partes de código Java. Los bucles de medición escritos manualmente casi siempre producen valores incorrectos porque la JVM es un entorno de ejecución con optimizaciones sofisticadas.

JMH existe para evitar esos problemas.

El benchmark ingenuo

Un primer intento típico consiste en envolver un bucle con System.nanoTime(). Parece razonable, pero presenta graves deficiencias para los microbenchmarks.

public class Main {
    static int compute(int n) { return n * n + 7; }
    public static void main(String[] args) {
        long start = System.nanoTime();
        int sink = 0;
        for (int i = 0; i < 1_000_000; i++) sink = compute(i);
        long elapsed = System.nanoTime() - start;
        System.out.println("ns: " + elapsed + " sink=" + sink);
    }
}

Problema 1: calentamiento del JIT

La JVM comienza en modo interpretado y solo compila los métodos activos a código nativo después de miles de invocaciones. Un benchmark ingenuo mide la fase interpretada, más lenta, mezclada con la fase compilada, más rápida, y produce promedios sin sentido.

JMH resuelve esto con una fase específica de calentamiento que se descarta.

Problema 2: eliminación de código muerto

Si un resultado calculado nunca se utiliza, el JIT puede eliminar por completo el cálculo. En ese caso, su benchmark mide un bucle vacío.

JMH proporciona el consumo del valor devuelto y Blackhole para evitarlo.

Problema 3: plegado de constantes

Si las entradas son constantes conocidas en tiempo de compilación, el JIT calcula la respuesta una vez y la reutiliza. En el ejemplo siguiente, el compilador podría sustituir todo el bucle por una sola constante.

JMH utiliza objetos @State para que las entradas sean opacas para el optimizador.

public class Main {
    public static void main(String[] args) {
        // 2 * 21 is constant; the JIT folds it to 42
        int result = 2 * 21;
        System.out.println(result);
    }
}

Problema 4: optimizaciones de bucles

El JIT desenrolla bucles, eleva el código invariante y vectoriza las operaciones. Un bucle escrito manualmente mide estas optimizaciones en lugar de la operación que pretendía probar.

JMH reemplaza su bucle por un número de iteraciones cuidadosamente controlado y gestionado por el propio JMH.

Problema 5: reemplazo sobre la pila

Un bucle de larga duración en main puede compilarse durante la ejecución (reemplazo sobre la pila), lo que produce características de rendimiento diferentes de las de un método compilado normalmente. Esto distorsiona los resultados de forma impredecible.

Qué proporciona JMH

  • Iteraciones de calentamiento independientes que se descartan.
  • Múltiples iteraciones de medición con estadísticas.
  • Ejecución en JVM nuevas para evitar la contaminación de los perfiles.
  • Blackhole y consumo de resultados para evitar la eliminación de código muerto.
  • Objetos @State para impedir el plegado de constantes.

Cómo ejecutarlo

JMH es una dependencia independiente (org.openjdk.jmh) y normalmente se inicia mediante un procesador de anotaciones y una compilación de Maven/Gradle que produce un JAR ejecutable. Los benchmarks no se ejecutan desde un main común como el código ordinario.

Las estadísticas importan

JMH no informa únicamente de un promedio, sino también del error / intervalo de confianza entre las iteraciones y las ejecuciones independientes. Un resultado de 42.0 +/- 1.3 ns/op indica tanto el valor central como cuánto varió, algo esencial para poder confiar en una medición.

Cuándo recurrir a JMH

Use JMH al comparar dos implementaciones de una ruta caliente, validar una optimización o medir operaciones de nanosegundos a microsegundos. Para trabajos más generales, de escala de segundos (E/S, red), normalmente basta con medir el tiempo de reloj.

Comprobación rápida

Compruebe su comprensión de por qué se necesita JMH.

Repaso

Ha aprendido por qué los microbenchmarks necesitan un harness:

  • La JVM se calienta: el código interpretado solo se convierte en código compilado después de muchas llamadas.
  • La eliminación de código muerto y el plegado de constantes pueden eliminar o calcular previamente su trabajo.
  • Las optimizaciones de bucles y el reemplazo sobre la pila distorsionan los bucles escritos manualmente.
  • JMH añade calentamiento, iteraciones de medición, ejecuciones en JVM nuevas, Blackhole y estadísticas.
  • Recurra a él al medir rutas calientes de escala de nanosegundos.

Preguntas frecuentes

¿La lección «Por qué usar JMH» es gratis?

Sí — el texto completo de «Por qué usar JMH» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Por qué usar JMH»?

Evite errores ingenuos en los benchmarks Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Por qué usar JMH»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué usar JMH
  2. Escritura de un benchmark
  3. Calentamiento e iteraciones
  4. Cómo evitar la eliminación de código muerto
← Volver a Java Academy