Java Academy · Les

Waarom JMH

Naïeve fouten bij benchmarks vermijden

Les 1 van 413 stappen

Waarom JMH is een gratis Java Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Waarom JMH

De Java Microbenchmark Harness (JMH) is het standaardhulpmiddel voor het meten van de prestaties van kleine stukken Java-code. Zelfgeschreven timinglussen leveren bijna altijd verkeerde waarden op, omdat de JVM een geavanceerde optimaliserende uitvoeringsomgeving is.

JMH is gemaakt om deze valkuilen te ondervangen.

De naïeve benchmark

Een typische eerste poging wikkelt een lus in System.nanoTime(). Dat ziet er redelijk uit, maar is voor microbenchmarks fundamenteel gebrekkig.

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);
    }
}

Probleem 1: JIT-opwarming

De JVM start in de modus geïnterpreteerd en compileert hete methoden pas na duizenden aanroepen naar native code. Een naïeve benchmark meet de trage geïnterpreteerde fase samen met de snelle gecompileerde fase, waardoor betekenisloze gemiddelden ontstaan.

JMH lost dit op met een speciale fase voor opwarming die wordt weggegooid.

Probleem 2: verwijdering van dode code

Als een berekend resultaat nooit wordt gebruikt, kan de JIT de berekening volledig verwijderen. Je benchmark meet dan een lege lus.

JMH biedt het verwerken van retourwaarden en de Blackhole om dit te voorkomen.

Probleem 3: vooraf berekenen van constanten

Als invoerwaarden compileertijdconstanten zijn, berekent de JIT het antwoord één keer en gebruikt het opnieuw. Hieronder kan de compiler de hele lus vervangen door één constante.

JMH gebruikt @State-objecten, zodat invoerwaarden ondoorzichtig zijn voor de optimaliseerder.

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);
    }
}

Probleem 4: lusoptimalisaties

De JIT rolt lussen uit, haalt invariante code naar buiten en vectoriseert bewerkingen. Een handgeschreven lus meet deze optimalisaties in plaats van de bewerking die je wilde testen.

JMH vervangt je lus door zorgvuldig beheerde aantallen iteraties die het zelf beheert.

Probleem 5: vervanging op de stack

Een langlopende lus in main kan tijdens de uitvoering worden gecompileerd (vervanging op de stack), waardoor de prestatiekenmerken verschillen van die van een normaal gecompileerde methode. Dit vertekent de resultaten op onvoorspelbare wijze.

Wat JMH biedt

  • Afzonderlijke, weggegooide iteraties voor opwarming.
  • Meerdere meetiteraties met statistieken.
  • Uitvoering in nieuwe JVM's om vervuiling van profielen te voorkomen.
  • Blackhole en het verwerken van resultaten tegen verwijdering van dode code.
  • @State-objecten om het vooraf berekenen van constanten te voorkomen.

Zo voer je het uit

JMH is een afzonderlijke afhankelijkheid (org.openjdk.jmh) en wordt normaal gestart door een annotatieverwerker en een Maven/Gradle-bouwproces dat een uitvoerbaar JAR-bestand maakt. Je voert benchmarks niet vanuit een gewone main uit zoals gewone code.

Statistieken zijn belangrijk

JMH rapporteert niet alleen een gemiddelde, maar ook de foutmarge / het betrouwbaarheidsinterval over iteraties en uitvoeringen. Een resultaat als 42.0 +/- 1.3 ns/op vertelt je zowel de centrale waarde als hoeveel die varieerde — essentieel om een meting te kunnen vertrouwen.

Wanneer gebruik je JMH

Gebruik JMH wanneer je twee implementaties van een heet pad vergelijkt, een optimalisatie controleert of bewerkingen van nanoseconden tot microseconden meet. Voor grof werk op de schaal van seconden, zoals invoer en uitvoer of netwerkverkeer, is meten met de verstreken tijd meestal voldoende.

Korte controle

Test je begrip van waarom JMH nodig is.

Samenvatting

Je hebt geleerd waarom microbenchmarking een harnas nodig heeft:

  • De JVM warmt op: geïnterpreteerde code wordt pas na veel aanroepen gecompileerd.
  • Verwijdering van dode code en het vooraf berekenen van constanten kunnen je werk verwijderen of vooraf berekenen.
  • Lusoptimalisaties en vervanging op de stack verstoren handgeschreven lussen.
  • JMH voegt opwarming, meetiteraties, uitvoeringen, Blackhole en statistieken toe.
  • Gebruik het wanneer je hete paden op nanoseconde-schaal meet.
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Waarom JMH” gratis?

Ja — de volledige tekst van “Waarom JMH” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Waarom JMH”?

Naïeve fouten bij benchmarks vermijden Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Waarom JMH”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Waarom JMH
  2. Een benchmark schrijven
  3. Opwarmen en iteraties
  4. Dead-code elimination vermijden
← Terug naar Java Academy