0Pricing
Ruby Academy · Lektion

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_objects wä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 .freeze auf
# 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 s

Symbole 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.inspect

Streamen statt Laden

Eine ganze Datei in den Speicher einzulesen, ist verschwenderisch. Streamen Sie sie stattdessen Zeile für Zeile.

  • each_line verarbeitet jeweils eine Zeile
  • Konstanter Speicherbedarf unabhängig von der Dateigröße
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

String-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 buffer

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

  1. Performance messen
  2. Profiling-Tools
  3. Speicheroptimierung
  4. Häufige Bottlenecks
← Zurück zu Ruby Academy