0Pricing
Java Academy · Lektion

Aufwärmen und Iterationen

Performance im eingeschwungenen Zustand messen

Aufwärmen und Iterationen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Warmup und Iterationen

JMH misst die Leistung im eingeschwungenen Zustand: die Geschwindigkeit, die Ihr Code erreicht, nachdem die JVM ihn vollständig optimiert hat. Dazu führt JMH zunächst verworfene Warmup-Iterationen und anschließend echte Messiterationen aus. In dieser Lektion geht es darum, beide Phasen abzustimmen.

Warum Warmup erforderlich ist

Frühe Aufrufe werden interpretiert und sind langsam; sobald der JIT die häufig ausgeführte Methode kompiliert hat, werden die Aufrufe deutlich schneller. Würden Sie den langsamen Start in Ihre Zahlen einbeziehen, würden diese zu hoch ausfallen. Warmup-Iterationen führen den Code aus, aber ihre Zeiten werden verworfen.

@Warmup

@Warmup steuert die verworfene Phase: wie viele Iterationen ausgeführt werden und wie lange jede einzelne dauert.

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

public class Bench {
    @Benchmark
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

@Measurement

@Measurement steuert die echte, aufgezeichnete Phase. Mehr Iterationen verkleinern das Konfidenzintervall, verlängern aber den Durchlauf.

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

public class Bench {
    @Benchmark
    @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

Iterationen und Operationen

Seien Sie bei den Begriffen aufmerksam. Eine Iteration ist ein zeitlich begrenztes Fenster (zum Beispiel eine Sekunde). Innerhalb jedes Fensters ruft JMH die Benchmark-Methode so oft wie möglich auf; jeder Aufruf ist eine Operation. Der Messwert wird pro Operation ausgegeben.

Wie viele Warmups sind ausreichend

Beobachten Sie die Ausgabe pro Iteration. Wenn sich aufeinanderfolgende Warmup-Iterationen nicht mehr verändern, hat sich der JIT stabilisiert. Wenn die ersten Messiterationen noch abweichen, fügen Sie mehr Warmup hinzu. Fünf Warmup- und zehn Messiterationen sind ein üblicher Ausgangspunkt.

Forks sorgen für zusätzliches Warmup

Jeder Fork verwendet eine vollständig neue JVM, daher wiederholt jeder Fork das gesamte Warmup. Mehrere Forks isolieren sowohl die JIT-Profile als auch die Streuung zwischen JVMs. Das ist das ehrlichste Maß für die Stabilität.

import org.openjdk.jmh.annotations.*;

@Fork(3)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
public class Bench {
    @Benchmark
    public double sqrt() {
        return Math.sqrt(2.0);
    }
}

Die Auswirkung demonstrieren

Diese einfache Java-Schleife gibt die Zeiten pro Stapel aus. Häufig werden Sie sehen, dass die ersten Stapel langsamer ausgeführt werden als die späteren, während der JIT die Methode kompiliert — genau diesen Effekt verwirft das Warmup.

public class Main {
    static long busy(int n) {
        long s = 0;
        for (int i = 0; i < n; i++) s += (long) Math.sqrt(i);
        return s;
    }
    public static void main(String[] args) {
        for (int batch = 0; batch < 5; batch++) {
            long t = System.nanoTime();
            long r = busy(2_000_000);
            System.out.println("batch " + batch + ": "
                + (System.nanoTime() - t) / 1000 + " us, r=" + r);
        }
    }
}

Zeitbasiert und anzahlbasiert

Standardmäßig sind Iterationen zeitbasiert (sie laufen N Sekunden lang). Sie können mit batchSize und Single-Shot-Modi zu einer festen Anzahl von Operationen wechseln. Zeitbasierte Iterationen sind jedoch üblich, weil sie sich an die Geschwindigkeit des Rechners anpassen.

Nicht überoptimieren

Sehr lange Durchläufe kosten Zeit, verbessern die Genauigkeit aber kaum noch, sobald der eingeschwungene Zustand erreicht ist. Streben Sie über mehrere Forks hinweg stabile, wiederholbare Zahlen an, statt die Anzahl der Iterationen zu maximieren. Reproduzierbarkeit ist wichtiger als eine einzelne beeindruckende Zahl.

Die Stabilisierung ablesen

JMH gibt während des Durchlaufs den Messwert jeder Iteration aus. Ein gesunder Benchmark zeigt konvergierende Warmup-Iterationen und eng um den endgültigen Messwert gruppierte Messiterationen mit einem kleinen +/--Fehler.

Kurzer Test

Testen Sie Ihr Verständnis von Warmup und Iterationen.

Zusammenfassung

Sie haben gelernt, die Leistung im eingeschwungenen Zustand zu messen:

  • @Warmup führt verworfene Iterationen aus, damit der JIT kompilieren kann.
  • @Measurement führt die aufgezeichneten Iterationen aus; mehr Iterationen verkleinern den Fehlerbereich.
  • Eine Iteration ist ein zeitlich begrenztes Fenster; jeder darin enthaltene Aufruf ist eine Operation.
  • Mehrere @Forks wiederholen das Warmup in neuen JVMs und zeigen die Streuung zwischen JVMs.
  • Streben Sie reproduzierbare, stabile Messwerte statt einer maximalen Laufzeit an.

Häufig gestellte Fragen

Ist die Lektion „Aufwärmen und Iterationen“ kostenlos?

Ja — der vollständige Text von „Aufwärmen und Iterationen“ 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 „Aufwärmen und Iterationen“?

Performance im eingeschwungenen Zustand messen 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 3 von 4.

Wie lange dauert die Lektion „Aufwärmen und Iterationen“?

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