0Pricing
Ruby Academy · Lezione

Ottimizzazione della memoria

Ridurre le allocazioni

Ottimizzazione della memoria è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.

Perché la memoria è importante

Ogni oggetto creato da Ruby consuma memoria e aggiunge lavoro al garbage collector. Meno allocazioni significano programmi più veloci e leggeri.

  • Il GC sospende l'esecuzione per recuperare gli oggetti
  • Un'elevata frequenza di allocazione attiva più esecuzioni del GC
  • Ridurre le allocazioni è spesso il miglioramento più significativo
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"

Conteggio delle allocazioni

GC.stat espone i contatori delle allocazioni, che è possibile confrontare prima e dopo un blocco.

  • :total_allocated_objects aumenta continuamente
  • Confronti i valori prima e dopo per misurare una sezione
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 } }

Stringhe congelate

Le stringhe letterali ripetute allocano ogni volta un nuovo oggetto. Congelarle consente a Ruby di riutilizzare un'unica istanza immutabile.

  • Aggiunga il commento magico all'inizio del file
  • Oppure chiami .freeze sulle singole stringhe letterali
# frozen_string_literal: true

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

Eviti le allocazioni nei cicli

Creare oggetti all'interno di cicli molto frequenti moltiplica le allocazioni. Sposti le costanti all'esterno.

  • Costruisca regex, array e stringhe una sola volta
  • Le riutilizzi nelle varie iterazioni
PATTERN = /\d+/

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

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

Metodi mutanti (bang)

I metodi senza bang restituiscono nuovi oggetti; i metodi bang modificano l'oggetto direttamente, risparmiando allocazioni.

  • map!, gsub!, sort!
  • Li utilizzi solo quando modificare l'originale è sicuro
arr = [3, 1, 2]
arr.sort!
puts arr.inspect

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

Simboli e stringhe come chiavi

I simboli sono internati: lo stesso simbolo corrisponde a un unico oggetto condiviso. Li utilizzi per le chiavi degli hash.

  • Le chiavi di tipo stringa allocano una nuova stringa ogni volta
  • I simboli fanno risparmiare memoria nelle ricerche ripetute
puts :name.equal?(:name)
puts 'name'.equal?('name')

Enumerator lazy

Collegare map e select crea array intermedi. lazy elabora gli elementi uno alla volta.

  • Non vengono allocate collezioni intermedie
  • È ideale per sequenze grandi o infinite
result = (1..Float::INFINITY).lazy
  .select { |n| n.even? }
  .map { |n| n * n }
  .first(5)
puts result.inspect

Elaborare in streaming invece di caricare

Leggere un intero file in memoria è uno spreco. Utilizzi lo streaming riga per riga.

  • each_line elabora una riga alla volta
  • La memoria utilizzata rimane costante, indipendentemente dalle dimensioni del file
text = "line1\nline2\nline3"
text.each_line do |line|
  puts line.strip.upcase
end

Concatenazione di stringhe

Costruire stringhe con + in un ciclo alloca ogni volta una nuova stringa. Utilizzi << per aggiungere contenuto direttamente alla stringa esistente.

  • + crea un nuovo oggetto
  • << modifica il buffer esistente
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts buffer

Pooling e riutilizzo degli oggetti

Riutilizzi gli oggetti costosi invece di ricrearli.

  • Memorizzi nella cache le configurazioni analizzate o le regex compilate
  • Utilizzi una costante o un valore memorizzato tramite memoizzazione
def config
  @config ||= { host: 'localhost', port: 4567 }
end

puts config.equal?(config)

Analizzare il GC

Può esaminare il comportamento del GC per verificare i miglioramenti.

  • GC.stat(:count) mostra quante esecuzioni del GC sono avvenute
  • Meno esecuzioni dopo l'ottimizzazione sono un buon segnale
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"

Verifica rapida

Verifichi le Sue conoscenze sull'ottimizzazione della memoria.

Riepilogo

Ha imparato a ottimizzare la memoria:

  • Contare le allocazioni con GC.stat
  • Congelare le stringhe letterali e riutilizzare gli oggetti
  • Preferire i metodi bang e << per evitare nuovi oggetti
  • Utilizzare i simboli per le chiavi e gli enumerator lazy per le pipeline
  • Elaborare i dati di grandi dimensioni in streaming invece di caricarli tutti

Ora affronterà i più comuni colli di bottiglia delle prestazioni.

Domande Frequenti

La lezione «Ottimizzazione della memoria» è gratuita?

Sì — il testo completo di «Ottimizzazione della memoria» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.

Cosa imparerò in «Ottimizzazione della memoria»?

Ridurre le allocazioni Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Ruby Academy?

Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Ottimizzazione della memoria»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Ruby Academy?

Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Misurare le prestazioni
  2. Strumenti di profilazione
  3. Ottimizzazione della memoria
  4. Colli di bottiglia comuni
← Torna a Ruby Academy