Performance messen
Benchmark-Modul
Performance messen ist eine kostenlose Ruby Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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 Ruby Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum messen?
Ohne Messungen zu optimieren bedeutet, zu raten. Das Benchmark-Modul aus Rubys Standardbibliothek misst Code präzise.
- Finden Sie langsame Stellen, bevor Sie sie verändern
- Vergleichen Sie Implementierungen objektiv
- Vermeiden Sie verfrühte Optimierungen
require 'benchmark'
time = Benchmark.realtime do
1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"Benchmark.measure
Benchmark.measure gibt einen Bericht über Benutzer-, System- und Echtzeit zurück.
- Die Benutzerzeit ist die CPU-Zeit Ihres Codes
- Die Echtzeit ist die tatsächlich verstrichene Zeit
require 'benchmark'
result = Benchmark.measure do
500_000.times { |i| i.to_s }
end
puts resultBenchmark.bm
Benchmark.bm führt mehrere Blöcke aus und beschriftet sie in einer Tabelle.
- Übergeben Sie eine Breite für die Beschriftungen, um sie auszurichten
- Jeder Aufruf von
x.reportergibt eine Zeile
require 'benchmark'
Benchmark.bm(10) do |x|
x.report('to_s:') { 100_000.times { |i| i.to_s } }
x.report('inspect:') { 100_000.times { |i| i.inspect } }
endBenchmark.bmbm
Benchmark.bmbm führt zuerst einen Probelauf durch, um Caches und die GC aufzuwärmen und fairere Werte zu erhalten.
- Der erste Durchlauf wird verworfen
- Der zweite Durchlauf ist die eigentliche Messung
require 'benchmark'
Benchmark.bmbm do |x|
x.report('sum:') { (1..100_000).sum }
x.report('reduce:') { (1..100_000).reduce(:+) }
endrealtime für schnelle Zeitmessungen
Benchmark.realtime gibt nur die Sekunden der verstrichenen Echtzeit als Float zurück.
- Die einfachste Möglichkeit, einen einzelnen Block zu messen
- Gut für schnelle, ungeplante Prüfungen
require 'benchmark'
elapsed = Benchmark.realtime do
arr = Array.new(100_000) { rand }
arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"Monotone Uhr
Verwenden Sie für präzise Messungen, die nicht von Änderungen der Systemuhr beeinflusst werden, Process.clock_gettime mit einer monotonen Uhr.
- Unempfindlich gegenüber NTP-Anpassungen
- Die genaueste integrierte Option
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
200_000.times { |i| i * i }
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
puts "Elapsed: #{(finish - start).round(4)}s"Zwei Ansätze vergleichen
Benchmarks sind besonders nützlich, wenn Sie Alternativen vergleichen. Führen Sie beide unter identischer Last aus.
- Die Eingabegröße muss groß genug sein, damit die Messung aussagekräftig ist
- Wiederholen Sie die Messung, um Schwankungen zu verringern
require 'benchmark'
arr = (1..100_000).to_a
Benchmark.bm(8) do |x|
x.report('map:') { arr.map { |n| n * 2 } }
x.report('each:') { r = []; arr.each { |n| r << n * 2 } }
endVorsicht bei Mikrobenchmarks
Kleine Benchmarks können irreführend sein.
- JIT und Caches spiegeln reale Workloads möglicherweise nicht wider
- Die GC kann während der Messung ausgeführt werden
- Messen Sie realistische Datengrößen
require 'benchmark'
# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"Iterationen pro Sekunde
Oft benötigen Sie den Durchsatz: die Anzahl der Operationen pro Sekunde. Das Gem benchmark-ips gibt diesen Wert aus, Sie können ihn aber auch manuell annähern.
- Zählen Sie die Iterationen in einem festgelegten Zeitfenster
- Eine höhere ips bedeutet eine höhere Geschwindigkeit
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + 0.2
count = 0
while Process.clock_gettime(Process::CLOCK_MONOTONIC) < deadline
count += 1
'hello'.upcase
end
puts "Iterations in 0.2s: #{count}"Die GC steuern
Der Garbage Collector kann Ergebnisse verzerren. Sie können ihn vorübergehend deaktivieren, um gleichmäßigere Werte zu erhalten.
GC.disablevorher undGC.enabledanach- Verwenden Sie dies mit Bedacht, um ein übermäßiges Speicherwachstum zu vermeiden
require 'benchmark'
GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"Mehrere Durchläufe mitteln
Führen Sie einen Benchmark mehrmals aus und mitteln Sie die Ergebnisse, um Schwankungen auszugleichen.
- Verwerfen Sie bei Bedarf den langsamsten Ausreißer
- Geben Sie den Median an, um stabile Werte zu erhalten
require 'benchmark'
times = 3.times.map do
Benchmark.realtime { (1..50_000).map { |n| n * n } }
end
avg = times.sum / times.size
puts "Average: #{avg.round(4)}s"Schnelltest
Testen Sie Ihr Wissen über Benchmarks.
Zusammenfassung
Sie haben gelernt, die Performance zu messen:
- Das
Benchmark-Modul misst Code präzise realtime,measure,bmundbmbmdienen unterschiedlichen Zwecken- Verwenden Sie für präzise Messungen die monotone Uhr
- Vermeiden Sie irreführende Mikrobenchmarks und berücksichtigen Sie die GC
- Mitteln Sie mehrere Durchläufe, um Schwankungen zu verringern
Als Nächstes verwenden Sie spezielle Profiling-Tools.
Häufig gestellte Fragen
Ist die Lektion „Performance messen“ kostenlos?
Ja — der vollständige Text von „Performance messen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Ruby Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Performance messen“?
Benchmark-Modul Du übst Ruby 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 Ruby Academy zu starten?
Keine Vorkenntnisse erforderlich. Ruby 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 1 von 4.
Wie lange dauert die Lektion „Performance messen“?
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 Ruby Academy-Lektion Code schreiben und ausführen?
Ja. Jede Ruby 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
- Performance messen
- Profiling-Tools
- Speicheroptimierung
- Häufige Bottlenecks