0Pricing
Java Academy · Lektion

Einen Benchmark schreiben

@Benchmark und Modi

Einen Benchmark schreiben ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Einen Benchmark schreiben

Ein JMH-Benchmark ist einfach eine mit @Benchmark annotierte Methode in einer gewöhnlichen Klasse. Der Annotationsprozessor von JMH erzeugt das umgebende Harness. In dieser Lektion geht es um die Annotationen, die festlegen, was und wie Sie messen.

Die Annotation @Benchmark

Markieren Sie eine beliebige öffentliche Methode mit @Benchmark, und JMH ruft sie wiederholt auf, wobei jeder Aufruf zeitlich gemessen wird. Der Rückgabewert der Methode sollte zurückgegeben und nicht verworfen werden, damit JMH ihn verarbeiten kann.

Eine minimale Benchmark-Klasse

So sieht die Grundstruktur eines Benchmarks aus. Der Import lautet org.openjdk.jmh.annotations.*. Da JMH nicht im Klassenpfad dieses Runners enthalten ist, dient dieses Beispiel nur zur Veranschaulichung.

import org.openjdk.jmh.annotations.Benchmark;

public class StringBench {
    @Benchmark
    public String concat() {
        return "foo" + System.nanoTime();
    }
}

Benchmark-Modi

@BenchmarkMode legt fest, was ausgegeben wird:

  • Throughput — Operationen pro Zeiteinheit (höher ist besser).
  • AverageTime — Zeit pro Operation (niedriger ist besser).
  • SampleTime — Verteilung der Zeiten (Perzentile).
  • SingleShotTime — ein einzelner Aufruf, geeignet für den Kaltstart.
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @BenchmarkMode(Mode.AverageTime)
    public int work() {
        return 2 + 2;
    }
}

Ausgabeeinheiten auswählen

@OutputTimeUnit legt die Zeiteinheit für den Bericht fest, damit die Zahlen gut lesbar sind. Für eine schnelle Operation sind Nanosekunden sinnvoll, für eine langsame Millisekunden.

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(TimeUnit.NANOSECONDS)
    public int work() {
        return 42;
    }
}

Ergebnisse zurückgeben

Geben Sie das Ergebnis der Arbeit immer zurück. JMH führt zurückgegebene Werte automatisch einem Blackhole zu und verhindert dadurch die Dead-Code-Eliminierung. Ein void-Benchmark, der etwas berechnet und verwirft, ist ein klassischer Fehler.

Standardwerte von Annotationen

Annotationen können an der Methode oder an der gesamten Klasse stehen. Annotationen auf Klassenebene gelten für jedes @Benchmark in dieser Klasse. Das hält die Konfiguration übersichtlich, wenn Sie mehrere zusammengehörige Benchmarks haben.

Forks

@Fork(n) führt den Benchmark in n neuen JVM-Prozessen aus. Forks isolieren jeden Durchlauf von JIT-Profilen, die durch vorherige Benchmarks aufgebaut wurden, und verbessern dadurch die Reproduzierbarkeit. Der Standardwert ist ein Fork.

import org.openjdk.jmh.annotations.*;

@Fork(2)
public class Bench {
    @Benchmark
    public long now() {
        return System.nanoTime();
    }
}

Den Runner starten

Sie starten Benchmarks über eine main-Methode, die ein Options-Objekt und einen Runner konfiguriert, oder über die erzeugte ausführbare JAR. Der reguläre Ausdruck in include(...) bestimmt, welche Benchmarks ausgeführt werden.

import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.*;

public class Launcher {
    public static void main(String[] args) throws Exception {
        Options opt = new OptionsBuilder()
            .include("Bench")
            .build();
        new Runner(opt).run();
    }
}

Die Ausgabe lesen

JMH gibt eine Tabelle mit dem Benchmark-Namen, dem Modus, der Anzahl der Stichproben, dem Messwert, dem Messfehler und den Einheiten aus, zum Beispiel: Bench.work avgt 25 3.142 +/- 0.011 ns/op. Das +/- ist das Konfidenzintervall.

Benchmarks fokussiert halten

Jeder Benchmark sollte genau eine Sache messen. Wenn Sie Vorbereitung, E/A und die getestete Operation mischen, wird das Ergebnis verfälscht. Verschieben Sie die Vorbereitung in @Setup-Methoden (dies wird zusammen mit dem Zustand behandelt), sodass nur der häufig ausgeführte Pfad gemessen wird.

Kurzer Test

Testen Sie Ihr Verständnis vom Schreiben von Benchmarks.

Zusammenfassung

Sie haben gelernt, wie Sie einen JMH-Benchmark schreiben:

  • Annotieren Sie eine Methode mit @Benchmark und geben Sie das Ergebnis zurück.
  • @BenchmarkMode wählt Throughput, AverageTime, SampleTime oder SingleShotTime aus.
  • @OutputTimeUnit legt gut lesbare Einheiten fest; @Fork isoliert Durchläufe in neuen JVMs.
  • Starten Sie den Benchmark mit einem Runner und Options oder mit der erzeugten JAR.
  • Halten Sie jeden Benchmark auf einen einzelnen häufig ausgeführten Pfad fokussiert.

Häufig gestellte Fragen

Ist die Lektion „Einen Benchmark schreiben“ kostenlos?

Ja — der vollständige Text von „Einen Benchmark schreiben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Einen Benchmark schreiben“?

@Benchmark und Modi Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Einen Benchmark schreiben“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Warum JMH
  2. Einen Benchmark schreiben
  3. Aufwärmen und Iterationen
  4. Eliminierung toten Codes vermeiden
← Zurück zu Java Academy