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
Auch in der Bibliothek
HTML-Parsing in Go (Golang): Bibliotheken und Codebeispiele
Dapper C# (.NET): Komplette Anleitung mit Beispielen
Gorilla Mux für Go: Vollständige Anleitung mit Beispielen
Arbeiten mit Excel in TypeScript: Bibliotheken, Beispiele und Werkzeuge