Lua Academy · Lektion

Mønstre for benchmarking

Skriv pålidelige mikrobenchmarks med os.clock, og undgå almindelige faldgruber.

Lektion 4 af 413 trin

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() - t0

Undgå 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 elimination

Sammenligning 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))
end

Benchmarking 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.

Gratis at komme i gang

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

  1. Oversigt over LuaJIT-arkitekturen
  2. Skriv JIT-venlig Lua
  3. Profilering med jit.p og perf
  4. Mønstre for benchmarking
← Tilbage til Lua Academy