Optimasi Memori
Kurangi alokasi.
Optimasi Memori adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.
Mengapa Memori Penting
Setiap objek yang dibuat Ruby menggunakan memori dan menambah pekerjaan pengumpulan sampah. Alokasi yang lebih sedikit berarti program yang lebih cepat dan lebih hemat.
- GC berhenti sejenak untuk mengambil kembali objek
- Laju alokasi yang tinggi memicu lebih banyak eksekusi GC
- Mengurangi alokasi sering kali memberikan peningkatan terbesar
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"Menghitung Alokasi
GC.stat menyediakan penghitung alokasi yang dapat Anda bandingkan di sekitar suatu blok.
:total_allocated_objectsterus bertambah- Hitung selisih sebelum dan sesudah untuk mengukur suatu bagian
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 } }Literal Teks yang Dibekukan
Setiap literal teks yang berulang mengalokasikan objek baru. Membekukan literal tersebut memungkinkan Ruby menggunakan kembali satu instans yang tidak dapat diubah.
- Tambahkan komentar khusus di bagian atas berkas
- Atau panggil
.freezepada setiap literal
# frozen_string_literal: true
s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)Hindari Alokasi dalam Perulangan
Membuat objek di dalam perulangan intensif memperbanyak alokasi. Pindahkan konstanta ke luar.
- Buat ekspresi reguler, larik, dan teks sekali saja
- Gunakan kembali semuanya di setiap putaran
PATTERN = /\d+/
def count_numbers(lines)
lines.count { |line| line.match?(PATTERN) }
end
puts count_numbers(['a1', 'bb', 'c3'])Metode Pengubah (tanda seru)
Metode tanpa tanda seru mengembalikan objek baru; metode bertanda seru mengubah objek secara langsung sehingga menghemat alokasi.
map!,gsub!,sort!- Gunakan hanya jika mengubah objek asli aman dilakukan
arr = [3, 1, 2]
arr.sort!
puts arr.inspect
s = 'hello world'
s.upcase!
puts sSimbol dibandingkan Teks sebagai Kunci
Simbol disimpan secara internal: simbol yang sama merupakan satu objek bersama. Gunakan simbol untuk kunci hash.
- Kunci teks mengalokasikan teks baru setiap kali
- Simbol menghemat memori dalam pencarian berulang
puts :name.equal?(:name)
puts 'name'.equal?('name')Pencacah Tertunda
Merangkai map dan select membuat larik perantara. lazy memproses elemen satu per satu.
- Tidak ada koleksi perantara yang dialokasikan
- Sangat cocok untuk urutan besar atau tak terbatas
result = (1..Float::INFINITY).lazy
.select { |n| n.even? }
.map { |n| n * n }
.first(5)
puts result.inspectAlirkan, Jangan Muat Sekaligus
Membaca seluruh berkas ke dalam memori adalah pemborosan. Alirkan berkas baris demi baris.
each_linememproses satu baris setiap kali- Memori tetap, terlepas dari ukuran berkas
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endPenggabungan Teks
Membangun teks dengan + dalam perulangan mengalokasikan teks baru setiap kali. Gunakan << untuk menambahkan secara langsung.
+membuat objek baru<<mengubah penyangga yang sudah ada
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts bufferPengumpulan dan Penggunaan Kembali Objek
Gunakan kembali objek yang berbiaya tinggi alih-alih membuatnya lagi.
- Simpan konfigurasi yang telah diurai atau ekspresi reguler yang telah dikompilasi
- Gunakan konstanta atau nilai yang telah dimemoisasi
def config
@config ||= { host: 'localhost', port: 4567 }
end
puts config.equal?(config)Memicu GC untuk Mendapatkan Wawasan
Anda dapat memeriksa perilaku GC untuk memastikan adanya peningkatan.
GC.stat(:count)menunjukkan berapa kali GC berjalan- Lebih sedikit proses setelah optimasi merupakan pertanda baik
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"Pemeriksaan Singkat
Uji pengetahuan Anda tentang pengoptimalan memori.
Rangkuman
Anda telah mempelajari cara mengoptimalkan memori:
- Hitung alokasi dengan
GC.stat - Bekukan literal teks dan gunakan kembali objek
- Utamakan metode bertanda seru dan
<<untuk menghindari objek baru - Gunakan simbol untuk kunci dan pencacah tertunda untuk alur pemrosesan
- Alirkan data besar alih-alih memuat semuanya
Selanjutnya, Anda akan menangani hambatan kinerja yang umum.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Optimasi Memori” gratis?
Ya — teks lengkap “Optimasi Memori” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Ruby Academy, upgrade ke CoddyKit PRO. Kursus Ruby Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Optimasi Memori”?
Kurangi alokasi. Kamu berlatih Ruby Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Ruby Academy?
Tidak diperlukan pengalaman sebelumnya. Ruby Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Optimasi Memori” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengukur Performa
- Alat Pembuatan Profil
- Optimasi Memori
- Bottleneck Umum