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_objectsaumenta 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
.freezesulle 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 sSimboli 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.inspectElaborare in streaming invece di caricare
Leggere un intero file in memoria è uno spreco. Utilizzi lo streaming riga per riga.
each_lineelabora 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
endConcatenazione 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 bufferPooling 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
- Misurare le prestazioni
- Strumenti di profilazione
- Ottimizzazione della memoria
- Colli di bottiglia comuni