Minnesoptimering
Minska antalet allokeringar.
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
.freezepå 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 sSymboler 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.inspectStrö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_linebehandlar en rad i taget- Konstant minnesanvändning oavsett filstorlek
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endSträ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 bufferObjektpoolning 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.
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
- Mät prestanda
- Profileringsverktyg
- Minnesoptimering
- Vanliga flaskhalsar