Pengoptimuman Memori
Kurangkan peruntukan
Pengoptimuman Memori ialah pelajaran Ruby Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ruby Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ruby Academy merangkumi sejumlah 4 pelajaran.
Mengapa Memori Penting
Setiap objek yang dicipta Ruby menggunakan memori dan menambah kerja pengumpulan sampah. Lebih sedikit allocations bermaksud program yang lebih pantas dan ringan.
- GC berhenti seketika untuk mendapatkan semula objek
- Kadar peruntukan yang tinggi mencetuskan lebih banyak larian GC
- Mengurangkan peruntukan selalunya memberikan peningkatan terbesar
before = GC.stat(:total_allocated_objects)
100.times { 'new string' + '!' }
after = GC.stat(:total_allocated_objects)
puts "Allocated: #{after - before} objects"Mengira Peruntukan
GC.stat mendedahkan kaunter peruntukan yang boleh anda bandingkan sebelum dan selepas satu blok.
:total_allocated_objectsterus meningkat tanpa henti- Bandingkan nilai sebelum dan selepas untuk mengukur satu bahagian
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 Rentetan Beku
Setiap literal rentetan yang diulang memperuntukkan objek baharu. Membekukannya membolehkan Ruby menggunakan semula satu tika tidak berubah.
- Tambahkan komen khas di bahagian atas fail
- Atau panggil
.freezepada literal individu
# frozen_string_literal: true
s1 = 'hello'
s2 = 'hello'
puts s1.equal?(s2)Elakkan Peruntukan dalam Gelung
Mencipta objek dalam gelung yang kerap berulang menggandakan peruntukan. Alihkan pemalar ke luar.
- Bina ungkapan nalar, tatasusunan dan rentetan sekali sahaja
- Gunakan semula kesemuanya merentas lelaran
PATTERN = /\d+/
def count_numbers(lines)
lines.count { |line| line.match?(PATTERN) }
end
puts count_numbers(['a1', 'bb', 'c3'])Kaedah Pengubahsuaian (bang)
Kaedah tanpa bang memulangkan objek baharu; kaedah bang mengubah objek di tempat asal, sekali gus menjimatkan peruntukan.
map!,gsub!,sort!- Gunakan hanya apabila mengubah objek asal adalah selamat
arr = [3, 1, 2]
arr.sort!
puts arr.inspect
s = 'hello world'
s.upcase!
puts sSimbol berbanding Rentetan sebagai Kunci
Simbol disimpan secara dalaman: simbol yang sama menggunakan satu objek yang dikongsi. Gunakannya untuk kunci cincangan.
- Kunci rentetan memperuntukkan rentetan baharu setiap kali
- Simbol menjimatkan memori dalam carian berulang
puts :name.equal?(:name)
puts 'name'.equal?('name')Penghitung Malas
Merangkaikan map dan select membina tatasusunan perantaraan. lazy memproses elemen satu demi satu.
- Tiada koleksi perantaraan diperuntukkan
- Sangat sesuai untuk jujukan besar atau tidak terhingga
result = (1..Float::INFINITY).lazy
.select { |n| n.even? }
.map { |n| n * n }
.first(5)
puts result.inspectPenstriman dan bukannya Memuatkan
Membaca seluruh fail ke dalam memori adalah membazir. Strim fail baris demi baris.
each_linememproses satu baris pada satu masa- Penggunaan memori kekal tetap tanpa mengira saiz fail
text = "line1\nline2\nline3"
text.each_line do |line|
puts line.strip.upcase
endPenggabungan Rentetan
Membina rentetan dengan + dalam gelung memperuntukkan rentetan baharu setiap kali. Gunakan << untuk menambah kandungan di tempat asal.
+mencipta objek baharu<<mengubah penimbal sedia ada
buffer = String.new
5.times { |i| buffer << "item#{i} " }
puts bufferPengumpulan dan Penggunaan Semula Objek
Gunakan semula objek yang mahal untuk dicipta dan bukannya menciptanya semula.
- Cache config yang telah dihurai atau ungkapan nalar yang telah dikompil
- Gunakan pemalar atau nilai yang dimemoisasi
def config
@config ||= { host: 'localhost', port: 4567 }
end
puts config.equal?(config)Mencetuskan GC untuk Mendapatkan Gambaran
Anda boleh memeriksa tingkah laku GC untuk mengesahkan penambahbaikan.
GC.stat(:count)menunjukkan bilangan kali GC telah dijalankan- Lebih sedikit larian selepas pengoptimuman ialah petanda yang baik
start = GC.stat(:count)
50_000.times { |i| [i] }
puts "GC runs: #{GC.stat(:count) - start}"Semakan Ringkas
Uji pengetahuan anda tentang pengoptimuman memori.
Rumusan
Anda telah belajar cara mengoptimumkan memori:
- Kira peruntukan dengan
GC.stat - Bekukan literal rentetan dan gunakan semula objek
- Utamakan kaedah bang dan
<<untuk mengelakkan objek baharu - Gunakan simbol untuk kunci dan penghitung malas untuk saluran pemprosesan
- Strim data besar dan bukannya memuatkan semuanya
Seterusnya, anda akan menangani kesesakan prestasi yang biasa.
Pelajari Ruby dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 29
- Pelajaran
- 109
Soalan Lazim
Adakah pelajaran “Pengoptimuman Memori” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Ruby Academy, termasuk “Pengoptimuman Memori”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Ruby Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengoptimuman Memori”?
Kurangkan peruntukan Anda berlatih Ruby Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Ruby Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Ruby Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Pengoptimuman Memori” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ruby Academy ini?
Ya. Setiap pelajaran Ruby Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengukur Prestasi
- Alat Pemprofilan
- Pengoptimuman Memori
- Kesempitan Lazim