Mønstre for benchmarking
Skriv pålidelige mikrobenchmarks med os.clock, og undgå almindelige faldgruber.
Mønstre for benchmarking er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvorfor benchmarke?
Mikrobenchmarks måler ydeevnen for et bestemt kodestykke isoleret. De hjælper med at kontrollere, at en optimering faktisk forbedrer hastigheden uden at være afhængig af mavefornemmelsen.
Grundlæggende benchmarkskabelon
Pak koden ind i en løkke, mål væguret med os.clock(), og divider med antal gentagelser.
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))Opvarmningskørsel
Kør en opvarmningskørsel før tidtagningen, så LuaJIT kan kompilere spor. Uden opvarmning indeholder den første målte kørsel overhead fra JIT-kompileringen.
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() - t0Undgå eliminering af død kode
JIT kan optimere beregninger væk, hvis resultaterne ikke bruges. Akkumulér resultaterne i en variabel for at gøre benchmarkets måling retvisende.
local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum) -- prevent eliminationSammenligning af to fremgangsmåder
Benchmark alternative implementeringer under identiske betingelser. Kør dem skiftevis eller flere gange for at minimere støj fra operativsystemets planlægning.
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))Statistisk analyse
Kør benchmarket flere gange, og beregn minimum, maksimum og median. Udelad afvigende målinger fra GC-pauser eller operativsystemets planlægning.
Måling af hukommelse
Mål hukommelsesallokering sammen med tiden.
collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))Undgå forstyrrelser fra GC
Stop GC før tidtagningen for at måle den rene beregningstid. Genoptag den bagefter.
collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")Realistiske benchmarks kontra mikrobenchmarks
Mikrobenchmarks optimerer små kodestykker, men afspejler ikke nødvendigvis ydeevnen i virkeligheden. Validér altid forbedringer op imod en profilering af hele applikationen.
Benchmarkværktøjer
Byg et genanvendeligt værktøj, benchmark(name, fn, iters), som udskriver ensartede, formaterede resultater for alle dine benchmarks.
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))
endBenchmarking i CI
Kør benchmarks i CI for at opdage forringelser af ydeevnen. Giv en advarsel, hvis et benchmark bliver mere end en defineret grænse langsommere (f.eks. 10 %).
Benchmarkspørgsmål
Hvorfor er en opvarmningskørsel vigtig, når du benchmarker LuaJIT-kode?
Opsummering: Benchmarkmønstre
Brug en opvarmningskørsel, undgå eliminering af død kode ved at bruge resultaterne, mål med os.clock(), kontrollér GC, og kør flere forsøg for at få stabile målinger. Byg et genanvendeligt benchmarkværktøj for at sikre ensartethed.
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Mønstre for benchmarking” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Mønstre for benchmarking”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Mønstre for benchmarking”?
Skriv pålidelige mikrobenchmarks med os.clock, og undgå almindelige faldgruber. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Mønstre for benchmarking”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Oversigt over LuaJIT-arkitekturen
- Skriv JIT-venlig Lua
- Profilering med jit.p og perf
- Mønstre for benchmarking