Minn оптимisering
Reduser allokeringer
Minn оптимisering er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hvorfor minne er viktig
Hvert objekt Ruby oppretter, bruker minne og gir mer arbeid for søppelsamleren. Færre allokeringer gir raskere og slankere programmer.
- GC setter utførelsen på pause for å frigjøre objekter
- Høy allokeringsrate utløser flere GC-kjøringer
- Å redusere allokeringer gir ofte den største gevinsten
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"Telle allokeringer
GC.stat viser tellere for allokeringer som du kan sammenligne før og etter en blokk.
:total_allocated_objectsøker gjennom hele prosessens levetid- Beregn differansen før og etter for å måle 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 } }Frosne strengliteraler
Gjentatte strengliteraler oppretter hvert sitt nye objekt. Hvis de fryses, kan Ruby gjenbruke én uforanderlig instans.
- Legg til magikommentaren øverst i en fil
- Eller kall
.freezepå individuelle literaler
# frozen_string_literal: true
s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)Unngå allokeringer i løkker
Når du oppretter objekter inne i tette løkker, blir antallet allokeringer mangedoblet. Flytt konstanter utenfor løkken.
- Opprett regulære uttrykk, arrayer og strenger én gang
- Gjenbruk dem i alle iterasjonene
PATTERN = /\d+/
def count_numbers(lines)
lines.count { |line| line.match?(PATTERN) }
end
puts count_numbers(['a1', 'bb', 'c3'])Muterende metoder (bang)
Metoder uten bang returnerer nye objekter, mens bang-metoder endrer objektet på stedet og sparer allokeringer.
map!,gsub!,sort!- Bruk dem bare når det er trygt å endre originalen
arr = [3, 1, 2]
arr.sort!
puts arr.inspect
s = 'hello world'
s.upcase!
puts sSymboler kontra strenger som nøkler
Symboler interners: Det samme symbolet er ett delt objekt. Bruk symboler som nøkler i hasher.
- Strengnøkler allokerer en ny streng hver gang
- Symboler sparer minne ved gjentatte oppslag
puts :name.equal?(:name)
puts 'name'.equal?('name')Late enumeratorer
Når du kjeder map og select, opprettes mellomliggende arrayer. lazy behandler elementene ett om gangen.
- Ingen mellomliggende samlinger allokeres
- Flott for store eller uendelige sekvenser
result = (1..Float::INFINITY).lazy
.select { |n| n.even? }
.map { |n| n * n }
.first(5)
puts result.inspectStrømming i stedet for innlasting
Det er sløsende å lese en hel fil inn i minnet. Strøm den i stedet, linje for linje.
each_linebehandler én linje om gangen- Konstant minnebruk uansett filstørrelse
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endStrengkonkatenering
Når du bygger strenger med + i en løkke, allokeres en ny streng hver gang. Bruk << for å legge til tekst på stedet.
+oppretter et nytt objekt<<endrer den eksisterende bufferen
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts bufferObjektpooling og gjenbruk
Gjenbruk kostbare objekter i stedet for å opprette dem på nytt.
- Bufre analyserte konfigurasjoner eller kompilerte regulære uttrykk
- Bruk en konstant eller en memo-aktivert verdi
def config
@config ||= { host: 'localhost', port: 4567 }
end
puts config.equal?(config)Utløs GC for å få innsikt
Du kan undersøke GC-atferden for å bekrefte forbedringer.
GC.stat(:count)viser hvor mange GC-kjøringer som har funnet sted- Færre kjøringer etter optimalisering er et godt tegn
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"Rask sjekk
Test kunnskapene dine om minneoptimalisering.
Oppsummering
Du har lært å optimalisere minnebruk:
- Tell allokeringer med
GC.stat - Frys strengliteraler og gjenbruk objekter
- Foretrekk bang-metoder og
<<for å unngå nye objekter - Bruk symboler som nøkler og late enumeratorer i pipelines
- Strøm store datamengder i stedet for å laste inn alt
Deretter skal du ta for deg vanlige ytelsesflaskehalser.
Lær deg Ruby med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 29
- Leksjoner
- 109
Ofte stilte spørsmål
Er leksjonen «Minn оптимisering» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Minn оптимisering», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Minn оптимisering»?
Reduser allokeringer Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Ruby Academy?
Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Minn оптимisering»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?
Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Måle ytelse
- Profileringsverktøy
- Minn оптимisering
- Vanlige flaskehalser