Speicheroptimierung
Allokationen reduzieren
Speicheroptimierung ist eine kostenlose Ruby Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 Speicher wichtig ist
Jedes von Ruby erstellte Objekt benötigt Speicher und verursacht zusätzliche Arbeit für die Garbage Collection. Weniger Allokationen bedeuten schnellere und schlankere Programme.
- Die GC pausiert, um Objekte zurückzugewinnen
- Hohe Allokationsraten lösen häufiger GC-Durchläufe aus
- Das Reduzieren von Allokationen bringt oft den größten Leistungsgewinn
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"Allokationen zählen
GC.stat stellt Zähler für Allokationen bereit, deren Werte Sie vor und nach einem Block vergleichen können.
:total_allocated_objectswächst dauerhaft- Vergleichen Sie die Werte vor und nach dem Block, um einen Abschnitt zu messen
def allocations
before = GC.stat(:total_allocated_objects)
yield
GC.stat(:total_allocated_objects) - before
end
puts allocations { Array.new(1000) { |i| i.to_s } }Unveränderliche String-Literale
Wiederholte String-Literale erzeugen jeweils ein neues Objekt. Wenn Sie sie einfrieren, kann Ruby dieselbe unveränderliche Instanz wiederverwenden.
- Fügen Sie den Magic Comment am Anfang einer Datei hinzu
- Oder rufen Sie bei einzelnen Literalen
.freezeauf
# frozen_string_literal: true
s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)Allokationen in Schleifen vermeiden
Das Erzeugen von Objekten in engen Schleifen vervielfacht die Allokationen. Ziehen Sie Konstanten aus der Schleife heraus.
- Erstellen Sie reguläre Ausdrücke, Arrays und Strings einmal
- Verwenden Sie sie über alle Iterationen hinweg wieder
PATTERN = /\d+/
def count_numbers(lines)
lines.count { |line| line.match?(PATTERN) }
end
puts count_numbers(['a1', 'bb', 'c3'])Mutierende Methoden (Bang)
Methoden ohne Bang geben neue Objekte zurück; Bang-Methoden verändern Objekte direkt und sparen dadurch Allokationen.
map!,gsub!,sort!- Verwenden Sie sie nur, wenn das Verändern des Originals unbedenklich ist
arr = [3, 1, 2]
arr.sort!
puts arr.inspect
s = 'hello world'
s.upcase!
puts sSymbole vs. Strings als Schlüssel
Symbole sind interniert: Dasselbe Symbol ist ein gemeinsam genutztes Objekt. Verwenden Sie sie als Hash-Schlüssel.
- String-Schlüssel erzeugen jedes Mal einen neuen String
- Symbole sparen bei wiederholten Suchvorgängen Speicher
puts :name.equal?(:name)
puts 'name'.equal?('name')Lazy-Enumeratoren
Das Verketten von map und select erzeugt Zwischenarrays. lazy verarbeitet Elemente einzeln.
- Es werden keine Zwischenkollektionen erzeugt
- Ideal für große oder unendliche Sequenzen
result = (1..Float::INFINITY).lazy
.select { |n| n.even? }
.map { |n| n * n }
.first(5)
puts result.inspectStreamen statt Laden
Eine ganze Datei in den Speicher einzulesen, ist verschwenderisch. Streamen Sie sie stattdessen Zeile für Zeile.
each_lineverarbeitet jeweils eine Zeile- Konstanter Speicherbedarf unabhängig von der Dateigröße
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endString-Verkettung
Das Erstellen von Strings mit + in einer Schleife erzeugt jedes Mal einen neuen String. Verwenden Sie <<, um direkt anzuhängen.
+erstellt ein neues Objekt<<verändert den vorhandenen Puffer
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts bufferObjekt-Pooling und Wiederverwendung
Verwenden Sie aufwendige Objekte wieder, statt sie neu zu erstellen.
- Zwischenspeichern Sie geparste Konfigurationen oder kompilierte reguläre Ausdrücke
- Verwenden Sie eine Konstante oder einen memoisierten Wert
def config
@config ||= { host: 'localhost', port: 4567 }
end
puts config.equal?(config)GC auslösen und Einblicke gewinnen
Sie können das Verhalten der GC untersuchen, um Verbesserungen zu bestätigen.
GC.stat(:count)zeigt, wie viele GC-Läufe stattgefunden haben- Weniger Läufe nach der Optimierung sind ein gutes Zeichen
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"Schnelltest
Testen Sie Ihr Wissen zur Speicheroptimierung.
Zusammenfassung
Sie haben gelernt, den Speicher zu optimieren:
- Zählen Sie Allokationen mit
GC.stat - Frieren Sie String-Literale ein und verwenden Sie Objekte wieder
- Bevorzugen Sie Bang-Methoden und
<<, um neue Objekte zu vermeiden - Verwenden Sie Symbole als Schlüssel und Lazy-Enumeratoren für Pipelines
- Streamen Sie große Datenmengen, statt alles zu laden
Als Nächstes beschäftigen Sie sich mit häufigen Performance-Engpässen.
Häufig gestellte Fragen
Ist die Lektion „Speicheroptimierung“ kostenlos?
Ja — der vollständige Text von „Speicheroptimierung“ 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 „Speicheroptimierung“?
Allokationen reduzieren 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 3 von 4.
Wie lange dauert die Lektion „Speicheroptimierung“?
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