Functioneel programmeren met Clojure en backendontwikkeling op de JVM · Les

Benchmarking en hotspotoptimalisatie

Leer codegedeelten te benchmarken en gerichte optimalisaties toe te passen op kritieke prestatiepaden.

Les 3 van 411 stappen

Benchmarking en hotspotoptimalisatie is een gratis Functioneel programmeren met Clojure en backendontwikkeling op de JVM-les op CoddyKit. Dit is les 3 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 Functioneel programmeren met Clojure en backendontwikkeling op de JVM. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Functioneel programmeren met Clojure en backendontwikkeling op de JVM bevat in totaal 4 lessen.

Wat is codebenchmarking?

Welkom bij benchmarking en hotspotoptimalisatie! In deze les leer je hoe je de prestaties van je code meet en gebieden voor verbetering vindt.

Benchmarking is het meten van de prestatiekenmerken van een programma of een specifiek onderdeel ervan. Meestal houdt dit in dat je de code meerdere keren uitvoert en statistieken verzamelt, zoals uitvoeringstijd en geheugengebruik.

Waarom benchmarking cruciaal is

Je denkt misschien te weten welk onderdeel van je code traag is, maar intuïtie kan je vaak misleiden. Daarom is de stelregel ‘Niet raden, maar meten!’ zo belangrijk bij het afstellen van prestaties.

Benchmarking levert objectieve, empirische gegevens op waarmee je knelpunten kunt vinden. Zonder deze gegevens loop je het risico tijd te besteden aan het optimaliseren van de verkeerde onderdelen van je toepassing, met weinig of geen prestatiewinst als gevolg.

Benchmarking van Clojure met Criterium

Voor betrouwbare benchmarking in Clojure is de bibliotheek criterium de feitelijke standaard. Deze voorkomt veelvoorkomende valkuilen van microbenchmarking op de JVM, zoals:

  • Opwarmfase: Code meerdere keren uitvoeren zodat de JIT-compiler van de JVM deze kan optimaliseren.
  • Garbagecollection: De verstoring ervan tijdens metingen beperken.
  • Statistische analyse: Betrouwbare meetwaarden leveren, zoals gemiddelde, mediaan en standaardafwijking.

Basisgebruik van Criterium

Om Criterium te gebruiken, moet je het eerst als afhankelijkheid aan je project toevoegen (bijvoorbeeld in project.clj of deps.edn). Vervolgens kun je de macro bench uit criterium.core gebruiken.

De macro bench neemt een expressie aan en voert deze herhaaldelijk uit terwijl de prestaties worden gemeten. Bekijk een eenvoudig voorbeeld:

(ns my-app.core
  (:require [criterium.core :refer [bench]]))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Preparing to benchmark...")
  ;; A simple benchmark
  (bench (reduce + (range 1000000)))
  (println "Benchmarking complete!"))

Benchmarkresultaten interpreteren

Wanneer je een Criterium-benchmark uitvoert, geeft deze gedetailleerde statistieken weer. Dit zijn de belangrijkste meetwaarden waarop je moet letten:

  • Gemiddelde: De gemiddelde uitvoeringstijd.
  • Mediaan: De middelste uitvoeringstijd wanneer de waarden zijn gesorteerd; deze is minder gevoelig voor uitschieters.
  • Standaardafwijking: Geeft de variatie in de resultaten aan. Lager is beter.
  • Iteraties per seconde: Hoe vaak de code per seconde kan worden uitgevoerd.

Richt je op het gemiddelde en de mediaan voor de gebruikelijke prestaties, en op de standaardafwijking om de consistentie te controleren.

Prestatiehotspots vinden

Een hotspot is een gedeelte van de code dat onevenredig veel uitvoeringstijd gebruikt. Met benchmarking kun je deze gebieden precies lokaliseren.

Vaak begin je met een bredere benchmark (bijvoorbeeld een volledige functie). Als die traag is, ga je verder door kleinere, belangrijke gedeelten binnen die functie te benchmarken totdat je het exacte knelpunt vindt.

Gerichte optimalisatiestrategieën

Pas gerichte optimalisaties toe zodra je een hotspot hebt gevonden. Veelgebruikte strategieën zijn:

  • Toewijzingen verminderen: Minder nieuwe objecten maken, vooral in krappe lussen.
  • Primitieven gebruiken: Java-primitieve typen (bijvoorbeeld int en long) benutten voor numerieke berekeningen via typeaanduidingen of directe Java-interoperabiliteit.
  • Memoization: Resultaten van kostbare pure functies cachen.
  • Algoritme kiezen: Efficiëntere algoritmen of datastructuren selecteren.

Optimalisatievoorbeeld: primitieven optellen

Vergelijk twee manieren om een lange reeks getallen op te tellen. De eerste gebruikt standaardfuncties van Clojure; de tweede gebruikt directe Java-interoperabiliteit met primitieve typen voor mogelijk betere prestaties in een hotspot.

Let op hoe typeaanduidingen (^long) en toegang tot Java-arrays (aget) de JVM kunnen aansturen om efficiëntere code voor numerieke taken te maken.

(ns my-app.core
  (:require [criterium.core :refer [bench]]))

(defn sum-clojure [n]
  (reduce + (range n)))

(defn sum-java-primitive [^long n]
  (let [arr (long-array n)]
    (dotimes [i n]
      (aset arr i i))
    (loop [i 0
           sum 0]
      (if (< i n)
        (recur (inc i) (+ sum (aget arr i)))
        sum))))

(defn -main
  "Compares Clojure vs. primitive Java sum."
  [& args]
  (println "Benchmarking Clojure sum...")
  (bench (sum-clojure 100000))

  (println "\nBenchmarking Java primitive sum...")
  (bench (sum-java-primitive 100000)))

Best practices voor benchmarking

Voor betrouwbare benchmarkresultaten:

  • Code isoleren: benchmark alleen het specifieke gedeelte dat je wilt onderzoeken.
  • Consistente omgeving: voer benchmarks uit op een consistent systeem met zo min mogelijk achtergrondprocessen.
  • Realistische gegevens: gebruik gegevens die het werkelijke gebruik van je toepassing weerspiegelen.
  • Meerdere uitvoeringen: Criterium handelt dit af, maar houd er rekening mee dat één uitvoering zelden genoeg is.

Voer altijd opnieuw een benchmark uit nadat je wijzigingen hebt aangebracht, om verbeteringen te controleren.

Korte controle: doel van benchmarken

Je hebt geleerd over benchmarken en het optimaliseren van hotspots. Laten we je begrip testen!

Samenvatting: benchmarken en optimaliseren

In deze les heb je een goed begrip gekregen van benchmarken en hotspotoptimalisatie:

  • We hebben geleerd dat benchmarken objectieve gegevens oplevert om prestatieknelpunten te identificeren.
  • We hebben criterium verkend als de standaardbibliotheek van Clojure voor benchmarken en bekeken hoe je de resultaten interpreteert.
  • Je hebt gezien hoe je hotspots identificeert en gerichte optimalisatiestrategieën toepast, waaronder het benutten van Java-primitieven.

Onthoud: meet altijd voordat je optimaliseert!

Gratis beginnen

Leer Clojure 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
12
Lessen
48

Veelgestelde vragen

Is de les “Benchmarking en hotspotoptimalisatie” gratis?

Ja — de volledige tekst van “Benchmarking en hotspotoptimalisatie” 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 Functioneel programmeren met Clojure en backendontwikkeling op de JVM wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Functioneel programmeren met Clojure en backendontwikkeling op de JVM bevat in totaal 4 lessen.

Wat leer ik in “Benchmarking en hotspotoptimalisatie”?

Leer codegedeelten te benchmarken en gerichte optimalisaties toe te passen op kritieke prestatiepaden. Je oefent met Functioneel programmeren met Clojure en backendontwikkeling op de JVM 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 Functioneel programmeren met Clojure en backendontwikkeling op de JVM te beginnen?

Ervaring vooraf is niet nodig. Functioneel programmeren met Clojure en backendontwikkeling op de JVM 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 3 van 4.

Hoe lang duurt de les “Benchmarking en hotspotoptimalisatie”?

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 Functioneel programmeren met Clojure en backendontwikkeling op de JVM?

Ja. Elke les over Functioneel programmeren met Clojure en backendontwikkeling op de JVM 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. Clojure-applicaties profileren
  2. Best practices voor JVM-prestaties
  3. Benchmarking en hotspotoptimalisatie
  4. Geheugenbeheer en GC-druk verminderen
← Terug naar Functioneel programmeren met Clojure en backendontwikkeling op de JVM