Ruby Academy · Lektion

Minnesoptimering

Minska antalet allokeringar.

Lektion 3 av 413 steg

Minnesoptimering är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Varför minnet är viktigt

Varje objekt som Ruby skapar kräver minne och ökar arbetet för garbage collection. Färre allokeringar ger snabbare och resurssnålare program.

  • GC pausar för att återvinna objekt
  • Hög allokeringstakt utlöser fler GC-körningar
  • Att minska antalet allokeringar ger ofta den största vinsten
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"

Räkna allokeringar

GC.stat visar räknare för allokeringar som Ni kan jämföra före och efter ett block.

  • :total_allocated_objects ökar utan gräns
  • Ta differensen före och efter för att mäta en del av koden
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 } }

Frysta strängliteraler

Varje upprepad strängliteral allokerar ett nytt objekt. Frysning av dem gör att Ruby kan återanvända en enda oföränderlig instans.

  • Lägg till den magiska kommentaren högst upp i en fil
  • Eller anropa .freeze på enskilda literaler
# frozen_string_literal: true

s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)

Undvik allokeringar i loopar

Att skapa objekt i täta loopar mångdubblar antalet allokeringar. Flytta ut konstanter.

  • Skapa reguljära uttryck, arrayer och strängar en gång
  • Återanvänd dem mellan iterationerna
PATTERN = /\d+/

def count_numbers(lines)
  lines.count { |line| line.match?(PATTERN) }
end

puts count_numbers(['a1', 'bb', 'c3'])

Muterande metoder (bang)

Metoder utan bang returnerar nya objekt; bang-metoder ändrar objektet på plats och sparar allokeringar.

  • map!, gsub!, sort!
  • Använd dem endast när det är säkert att ändra originalet
arr = [3, 1, 2]
arr.sort!
puts arr.inspect

s = 'hello world'
s.upcase!
puts s

Symboler kontra strängar som nycklar

Symboler internieras: samma symbol är ett enda delat objekt. Använd dem som nycklar i hash-tabeller.

  • Strängnycklar allokerar en ny sträng varje gång
  • Symboler sparar minne vid upprepade uppslagningar
puts :name.equal?(:name)
puts 'name'.equal?('name')

Lata enumeratorer

Att kedja map och select skapar mellanliggande arrayer. lazy behandlar elementen ett i taget.

  • Inga mellanliggande samlingar allokeras
  • Utmärkt för stora eller oändliga sekvenser
result = (1..Float::INFINITY).lazy
  .select { |n| n.even? }
  .map { |n| n * n }
  .first(5)
puts result.inspect

Strömma i stället för att läsa in

Att läsa in en hel fil i minnet är slösaktigt. Strömma den rad för rad i stället.

  • each_line behandlar en rad i taget
  • Konstant minnesanvändning oavsett filstorlek
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

Strängkonkatenering

Att bygga strängar med + i en loop allokerar en ny sträng varje gång. Använd << för att lägga till text på plats.

  • + skapar ett nytt objekt
  • << ändrar den befintliga bufferten
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts buffer

Objektpoolning och återanvändning

Återanvänd kostsamma objekt i stället för att skapa dem på nytt.

  • Cacha tolkade konfigurationer eller kompilerade reguljära uttryck
  • Använd en konstant eller ett memoiserat värde
def config
  @config ||= { host: 'localhost', port: 4567 }
end

puts config.equal?(config)

Utlös GC för att få insikt

Du kan undersöka GC-beteendet för att bekräfta förbättringar.

  • GC.stat(:count) visar hur många GC-körningar som har genomförts
  • Färre körningar efter optimering är ett gott tecken
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"

Snabbtest

Testa dina kunskaper om minnesoptimering.

Sammanfattning

Du har lärt dig att optimera minnet:

  • Räkna allokeringar med GC.stat
  • Frys strängliteraler och återanvänd objekt
  • Föredra bang-metoder och << för att undvika nya objekt
  • Använd symboler som nycklar och lata enumeratorer i bearbetningskedjor
  • Strömma stora datamängder i stället för att läsa in allt

Härnäst ska du ta itu med vanliga prestandaflaskhalsar.

Gratis att börja

Lär dig Ruby med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
109

Vanliga frågor

Är lektionen ”Minnesoptimering” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Minnesoptimering”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Minnesoptimering”?

Minska antalet allokeringar. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?

Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Minnesoptimering”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Ruby Academy-lektionen?

Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Mät prestanda
  2. Profileringsverktyg
  3. Minnesoptimering
  4. Vanliga flaskhalsar
← Tillbaka till Ruby Academy