Ruby Academy · leksjon

Minn оптимisering

Reduser allokeringer

Leksjon 3 av 413 trinn

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 .freeze på 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 s

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

Strø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_line behandler én linje om gangen
  • Konstant minnebruk uansett filstørrelse
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

Strengkonkatenering

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 buffer

Objektpooling 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.

Gratis å komme i gang

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

  1. Måle ytelse
  2. Profileringsverktøy
  3. Minn оптимisering
  4. Vanlige flaskehalser
← Tilbake til Ruby Academy