JMH Java: Vollständiges Tutorial mit Beispielen und Tipps

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

JMH (Java Microbenchmark Harness): Das ultimative Handbuch für Microbenchmarking in Java

JMH (Java Microbenchmark Harness) ist eine Bibliothek zum Erstellen, Ausführen und Analysieren von Microbenchmarks (Performance-Tests für kleine Codeabschnitte) in Java. Entwickelt vom JVM Performance Team (unter Beteiligung von Experten wie Alexey Shipilëv), gilt JMH als der De-facto-Standard für die Leistungsmessung kleiner Codefragmente im Java-Ökosystem.

1. Was ist JMH und warum braucht man es?

Einen korrekten Performance-Test für Java zu schreiben, ist eine anspruchsvolle Aufgabe. Der JIT-Compiler, der Garbage Collector, CPU-Optimierungen (Caching, spekulative Ausführung) und sogar die Ausführungsreihenfolge von Operationen können die Ergebnisse massiv verfälschen. Eine einfache for-Schleife in der main-Methode führt oft dazu, dass der JIT-Compiler den getesteten Code als "tot" eliminiert (Dead Code Elimination) – und Sie messen dann die Geschwindigkeit einer leeren Schleife.

JMH löst diese Probleme automatisch. Es steuert das Aufwärmen (Warmup) des Codes, damit der JIT-Compiler stabil läuft, verhindert die Optimierung von totem Code, verwaltet Forks zur Isolierung der JVM und liefert statistisch signifikante Ergebnisse (Mittelwert, Perzentile, Fehlertoleranz).

Warum braucht ein Entwickler JMH? Um fundierte Entscheidungen bei der Wahl von Algorithmen, Datenstrukturen, Serialisierungsmethoden, der Optimierung kritischer Codeabschnitte oder dem Vergleich verschiedener Implementierungen zu treffen (z. B. StringBuilder vs. String.concat). Ohne JMH riskieren Sie, etwas zu "optimieren", das gar kein Engpass ist, oder Ergebnisse zu erhalten, die sich in der Praxis nicht reproduzieren lassen.

2. Installation

JMH ist eine Java-Bibliothek und wird daher nicht über pip oder npm installiert. Der einfachste Weg ist die Verwendung von Maven oder Gradle.

Methode 1: Maven (empfohlen für den schnellen Einstieg)

Erstellen Sie ein neues Maven-Projekt und fügen Sie Folgendes in Ihre pom.xml ein:

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

Methode 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'
}

Methode 3: JAR herunterladen (nicht empfohlen)

Sie können ein Fat-JAR von GitHub herunterladen, aber das ist für die Abhängigkeitsverwaltung weniger praktisch.

3. Schnellstart – Minimales funktionierendes Beispiel

Empfehlungen