0Pricing
Lua Academy · Lektion

Muster für Benchmarking

Schreiben Sie zuverlässige Mikrobenchmarks mit os.clock und vermeiden Sie häufige Fallstricke

Muster für Benchmarking ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Benchmarks?

Microbenchmarks messen die Leistung eines bestimmten Codeausschnitts isoliert. Sie helfen zu überprüfen, ob eine Optimierung die Geschwindigkeit tatsächlich verbessert, ohne sich auf das eigene Gefühl verlassen zu müssen.

Grundlegendes Benchmark-Template

Führen Sie den Code in einer Schleife aus, messen Sie die verstrichene Zeit mit os.clock() und teilen Sie sie durch die Anzahl der Iterationen.

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

Aufwärmdurchlauf

Führen Sie vor der Zeitmessung einen Aufwärmdurchlauf aus, damit LuaJIT Traces kompilieren kann. Ohne Aufwärmen enthält der erste gemessene Durchlauf den Overhead der JIT-Kompilierung.

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

Eliminierung von totem Code verhindern

Der JIT kann Berechnungen wegoptimieren, deren Ergebnisse nicht verwendet werden. Akkumulieren Sie die Ergebnisse in einer Variablen, damit der Benchmark aussagekräftig bleibt.

local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum)  -- prevent elimination

Zwei Ansätze vergleichen

Vergleichen Sie alternative Implementierungen unter identischen Bedingungen. Führen Sie sie abwechselnd oder mehrfach aus, um das durch die Betriebssystemplanung verursachte Rauschen zu minimieren.

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

Führen Sie den Benchmark mehrfach aus und berechnen Sie Minimum, Maximum und Median. Ausreißer durch GC-Pausen oder die Betriebssystemplanung sollten verworfen werden.

Speicher-Benchmarking

Messen Sie die Speicherbelegung zusätzlich zur Ausführungszeit.

collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))

GC-Interferenzen vermeiden

Stoppen Sie die GC vor der Zeitmessung, um die reine Berechnungszeit zu messen. Starten Sie sie anschließend wieder.

collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")

Realistische Benchmarks im Vergleich zu Microbenchmarks

Microbenchmarks optimieren kleine Codeausschnitte, spiegeln aber möglicherweise die Leistung in der Praxis nicht wider. Überprüfen Sie Verbesserungen immer anhand des Profils der vollständigen Anwendung.

Benchmark-Hilfsfunktionen

Erstellen Sie eine wiederverwendbare benchmark(name, fn, iters)-Hilfsfunktion, die über alle Ihre Benchmarks hinweg konsistente, formatierte Ergebnisse ausgibt.

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 in CI

Führen Sie Benchmarks in der CI aus, um Leistungseinbußen zu erkennen. Lösen Sie eine Warnung aus, wenn sich ein Benchmark um mehr als einen festgelegten Schwellenwert verschlechtert, beispielsweise 10 %.

Benchmark-Frage

Warum ist ein Aufwärmdurchlauf beim Benchmarking von LuaJIT-Code wichtig?

Rückblick: Benchmark-Muster

Verwenden Sie einen Aufwärmdurchlauf, verhindern Sie die Eliminierung toten Codes durch Verwendung der Ergebnisse, messen Sie mit os.clock(), kontrollieren Sie die GC und führen Sie mehrere Durchläufe für stabile Messwerte aus. Erstellen Sie für einheitliche Ergebnisse eine wiederverwendbare Benchmark-Hilfsfunktion.

Häufig gestellte Fragen

Ist die Lektion „Muster für Benchmarking“ kostenlos?

Ja — der vollständige Text von „Muster für Benchmarking“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Muster für Benchmarking“?

Schreiben Sie zuverlässige Mikrobenchmarks mit os.clock und vermeiden Sie häufige Fallstricke Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Muster für Benchmarking“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Überblick über die LuaJIT-Architektur
  2. JIT-freundliches Lua schreiben
  3. Profiling mit jit.p und perf
  4. Muster für Benchmarking
← Zurück zu Lua Academy