0Pricing
Ruby Academy · Pelajaran

Bottleneck Umum

Percepat kode Ruby.

Bottleneck Umum adalah pelajaran Ruby Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Mengenali Hambatan Kinerja

Sebagian besar perlambatan Ruby berasal dari beberapa pola yang terus berulang. Dengan mengenalinya, Anda dapat memperbaiki kode dengan cepat.

  • Struktur data yang tidak tepat untuk kebutuhan
  • Pekerjaan berulang yang hasilnya dapat disimpan
  • Kueri N+1 dan perulangan bersarang

Pelajaran ini membahas penyebab yang paling umum.

puts 'Speeding up Ruby starts with knowing the usual suspects'

Array#include? dibandingkan Set

Memeriksa keanggotaan dengan Array#include? membutuhkan O(n). Set (atau tabel hash) menyediakan pencarian O(1).

  • Untuk pemeriksaan keanggotaan berulang, buat Set sekali
  • Peningkatan kecepatan sangat besar pada koleksi besar
require 'set'

allowed = Set.new(['a', 'b', 'c'])
puts allowed.include?('b')
puts allowed.include?('z')

Perulangan Bersarang (O(n kuadrat))

Membandingkan setiap pasangan elemen menghasilkan pertumbuhan kuadrat dan membesar drastis seiring ukuran data.

  • Ganti perulangan dalam dengan pencarian pada tabel hash
  • Ubah O(n kuadrat) menjadi O(n)
a = [1, 2, 3, 4]
b = [3, 4, 5]
set_b = b.to_set rescue require('set') || b.to_set
common = a.select { |x| set_b.include?(x) }
puts common.inspect

Pola N+1

Mengambil data terkait di dalam perulangan menyebabkan N+1 operasi.

  • 1 kueri untuk daftar, lalu 1 kueri untuk setiap item
  • Kelompokkan pencarian dengan satu pengambilan data terkelompok
# Bad: lookup inside loop
orders = [1, 2, 3]
prices = { 1 => 10, 2 => 20, 3 => 30 }
# Good: one preloaded hash, O(1) per item
total = orders.sum { |id| prices[id] }
puts total

Memoisasi

Menghitung ulang nilai yang sama dan mahal membuang waktu. Memoisasikan nilai tersebut dengan ||=.

  • Simpan hasilnya setelah perhitungan pertama
  • Pemanggilan berikutnya langsung mengembalikan hasil
class Report
  def total
    @total ||= begin
      puts 'computing...'
      (1..1000).sum
    end
  end
end

r = Report.new
puts r.total
puts r.total

Memilih Metode yang Tepat

Beberapa metode Enumerable jauh lebih cepat daripada rangkaian metode.

  • sum lebih cepat daripada inject(:+)
  • any? berhenti lebih awal, tidak seperti select.empty?
  • find berhenti pada kecocokan pertama
nums = (1..1_000_000)
puts nums.any? { |n| n > 5 }
puts nums.find { |n| n > 5 }

Menghindari Pengurutan Berulang

Mengurutkan di dalam perulangan atau berulang kali membutuhkan biaya besar. Urutkan sekali dan gunakan kembali hasilnya.

  • Pengurutan membutuhkan O(n log n)
  • Simpan hasil yang telah diurutkan jika data tidak berubah
data = [5, 2, 8, 1, 9]
sorted = data.sort
puts sorted.first
puts sorted.last

Pengelompokan dengan Tabel Hash

group_by dan tally mengagregasi dalam satu lintasan, bukan melalui pemindaian berulang.

  • tally menghitung kemunculan secara efisien
  • Menghindari perulangan penghitungan manual
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspect

Biaya Pembuatan Teks

Menggabungkan dengan join lebih cepat daripada penggabungan berulang untuk koleksi.

  • Buat sebuah larik, lalu gunakan join sekali
  • Menghindari banyak teks perantara
parts = (1..5).map { |i| "item#{i}" }
puts parts.join(', ')

Kompilasi Ekspresi Reguler

Mendefinisikan literal ekspresi reguler di dalam perulangan yang sering dijalankan akan mengompilasinya ulang secara implisit. Pindahkan literal tersebut ke konstanta.

  • Kompilasi sekali, cocokkan berkali-kali
  • Gunakan match? jika Anda hanya memerlukan nilai benar atau salah
EMAIL = /\A[^@\s]+@[^@\s]+\z/

inputs = ['a@b.com', 'nope', 'x@y.org']
valid = inputs.select { |s| EMAIL.match?(s) }
puts valid.inspect

Menunda Pekerjaan

Jangan menghitung sesuatu yang mungkin tidak pernah digunakan. Tunda dengan evaluasi tertunda atau kondisi penjaga.

  • Kembalikan hasil lebih awal jika memungkinkan
  • Hitung nilai yang berat hanya saat diperlukan
def describe(items)
  return 'empty' if items.empty?
  "#{items.size} items, first is #{items.first}"
end

puts describe([])
puts describe([10, 20])

Pemeriksaan Singkat

Uji pengetahuan Anda tentang hambatan kinerja.

Rangkuman

Anda telah mempelajari cara memperbaiki hambatan kinerja yang umum:

  • Gunakan Set atau tabel hash untuk keanggotaan cepat, bukan include?
  • Hilangkan perulangan bersarang dan pola N+1 dengan tabel hash yang telah dimuat lebih awal
  • Memoisasikan perhitungan mahal dengan ||=
  • Pilih metode yang efisien (sum, any?, tally) dan pindahkan ekspresi reguler ke luar perulangan
  • Tunda atau lewati pekerjaan yang mungkin tidak pernah diperlukan

Selalu ukur sebelum dan sesudah untuk memastikan peningkatannya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Bottleneck Umum” gratis?

Ya — teks lengkap “Bottleneck Umum” 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 “Bottleneck Umum”?

Percepat kode Ruby. 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 4 dari 4.

Berapa lama pelajaran “Bottleneck Umum” 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

  1. Mengukur Performa
  2. Alat Pembuatan Profil
  3. Optimasi Memori
  4. Bottleneck Umum
← Kembali ke Ruby Academy