Benchmarkpatronen
Schrijf betrouwbare microbenchmarks met os.clock en vermijd veelvoorkomende valkuilen
Benchmarkpatronen is een gratis Lua Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.
Waarom benchmarken?
Microbenchmarks meten de prestaties van een specifiek codefragment in isolatie. Ze helpen controleren of een optimalisatie de snelheid daadwerkelijk verbetert, zonder op intuïtie te vertrouwen.
Basissjabloon voor een benchmark
Plaats de code in een lus, meet de verstreken tijd met os.clock() en deel door het aantal iteraties.
local N = 1e6
local t0 = os.clock()
for i = 1, N do
-- code to benchmark
end
local elapsed = os.clock() - t0
print(("%.2f ns/op"):format(elapsed / N * 1e9))Opwarmingsronde
Voer vóór het meten een opwarmingsronde uit, zodat LuaJIT traces kan compileren. Zonder opwarming bevat de eerste gemeten uitvoering de overhead van JIT-compilatie.
for i = 1, 1000 do hotFunction(i) end -- warm up
local t0 = os.clock()
for i = 1, N do hotFunction(i) end
local elapsed = os.clock() - t0Eliminatie van ongebruikte code voorkomen
De JIT kan berekeningen wegoptimaliseren waarvan de resultaten niet worden gebruikt. Tel resultaten op in een variabele om de benchmark betrouwbaar te houden.
local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum) -- prevent eliminationTwee benaderingen vergelijken
Benchmark alternatieve implementaties onder identieke omstandigheden. Voer ze afwisselend of meerdere keren uit om ruis door planning van het besturingssysteem te beperken.
local function approach1() -- ...
end
local function approach2() -- ...
end
local function bench(fn, n)
local t = os.clock()
for _ = 1, n do fn() end
return os.clock() - t
end
print("A:", bench(approach1, 1e5))
print("B:", bench(approach2, 1e5))Statistische analyse
Voer de benchmark meerdere keren uit en bereken het minimum, maximum en de mediaan. Uitschieters door GC-pauzes of planning van het besturingssysteem moet je weggooien.
Geheugen benchmarken
Meet naast de tijd ook de geheugentoewijzing.
collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))Interferentie van GC vermijden
Stop de GC vóór het meten om de pure rekentijd te meten. Hervat de GC daarna.
collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")Realistische benchmarks versus microbenchmarks
Microbenchmarks optimaliseren kleine fragmenten, maar geven mogelijk niet de prestaties in de praktijk weer. Controleer verbeteringen altijd aan de hand van een volledig applicatieprofiel.
Hulpprogramma's voor benchmarks
Bouw een herbruikbaar hulpprogramma benchmark(name, fn, iters) dat bij al je benchmarks consistente, opgemaakte resultaten afdrukt.
local function benchmark(name, fn, iters)
iters = iters or 1e5
for _ = 1, iters // 10 do fn() end -- warm up
local t = os.clock()
for _ = 1, iters do fn() end
local ns = (os.clock() - t) / iters * 1e9
print(("%-30s %8.1f ns/op"):format(name, ns))
endBenchmarken in CI
Voer benchmarks uit in CI om prestatieverminderingen te detecteren. Geef een waarschuwing als een benchmark met meer dan een vastgelegde drempelwaarde (bijvoorbeeld 10%) achteruitgaat.
Benchmarkvraag
Waarom is een opwarmingsronde belangrijk bij het benchmarken van LuaJIT-code?
Samenvatting: benchmarkpatronen
Gebruik een opwarmingsronde, voorkom de eliminatie van ongebruikte code door resultaten te gebruiken, meet met os.clock(), houd de GC onder controle en voer meerdere metingen uit voor stabiele resultaten. Bouw een herbruikbaar benchmarkhulpprogramma voor consistentie.
Leer Lua 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
- 40
- Lessen
- 159
Veelgestelde vragen
Is de les “Benchmarkpatronen” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Benchmarkpatronen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.
Wat leer ik in “Benchmarkpatronen”?
Schrijf betrouwbare microbenchmarks met os.clock en vermijd veelvoorkomende valkuilen Je oefent met Lua 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 Lua Academy te beginnen?
Ervaring vooraf is niet nodig. Lua 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 4 van 4.
Hoe lang duurt de les “Benchmarkpatronen”?
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 Lua Academy?
Ja. Elke les over Lua 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
- Overzicht van de LuaJIT-architectuur
- JIT-vriendelijke Lua schrijven
- Profileren met jit.p en perf
- Benchmarkpatronen