Ruby Academy · Pelajaran

Kesempitan Lazim

Percepatkan kod Ruby

Pelajaran 4 daripada 413 langkah

Kesempitan Lazim ialah pelajaran Ruby Academy percuma di CoddyKit. Ini ialah pelajaran 4 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.

Mengenal Pasti Kesesakan

Kebanyakan kelembapan Ruby berpunca daripada beberapa corak berulang. Dengan mengetahuinya, anda boleh membaiki kod dengan cepat.

  • Struktur data yang tidak sesuai untuk tugas tersebut
  • Kerja berulang yang hasilnya boleh disimpan sementara
  • Pertanyaan N+1 dan gelung bersarang

Pelajaran ini merangkumi punca yang paling lazim.

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

Array#include? berbanding Set

Menyemak keahlian dengan Array#include? ialah O(n). Set (atau cincangan) memberikan carian O(1).

  • Untuk semakan keahlian berulang, bina satu Set sekali sahaja
  • Peningkatan kelajuan yang besar pada koleksi besar
require 'set'

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

Gelung Bersarang (O(n kuasa dua))

Membandingkan setiap pasangan elemen adalah kuadratik dan berkembang mendadak apabila saiz bertambah.

  • Gantikan gelung dalaman dengan carian cincangan
  • Tukarkan O(n kuasa dua) kepada 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

Corak N+1

Mendapatkan data berkaitan dalam gelung menyebabkan operasi N+1.

  • 1 pertanyaan untuk senarai, kemudian 1 pertanyaan bagi setiap item
  • Kumpulkan carian dengan satu pengambilan berkumpulan
# 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

Mengira semula nilai yang sama dan mahal membazirkan masa. Memoisasikannya dengan ||=.

  • Simpan hasil selepas pengiraan pertama
  • Panggilan seterusnya memulangkan hasil serta-merta
class Report
  def total
    @total ||= begin
      puts 'computing...'
      (1..1000).sum
    end
  end
end

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

Memilih Kaedah yang Tepat

Sesetengah kaedah Enumerable jauh lebih pantas berbanding rantaian kaedah.

  • sum lebih baik daripada inject(:+)
  • any? berhenti sebaik sahaja hasil diketahui, tidak seperti select.empty?
  • find berhenti pada padanan pertama
nums = (1..1_000_000)
puts nums.any? { |n| n > 5 }
puts nums.find { |n| n > 5 }

Elakkan Pengisihan Berulang

Mengisih dalam gelung atau berulang kali memerlukan kos yang tinggi. Isih sekali dan gunakan semula hasilnya.

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

Pengelompokan Cincangan

group_by dan tally mengagregat dalam satu laluan dan bukannya melalui imbasan berulang.

  • tally mengira kejadian dengan cekap
  • Mengelakkan gelung pengiraan manual
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspect

Kos Membina Rentetan

Menggabungkan dengan join lebih pantas daripada penggabungan berulang untuk koleksi.

  • Bina tatasusunan, kemudian gunakan join sekali sahaja
  • Mengelakkan banyak rentetan perantaraan
parts = (1..5).map { |i| "item#{i}" }
puts parts.join(', ')

Kompilasi Ungkapan Nalar

Menentukan literal ungkapan nalar dalam gelung yang kerap dijalankan menyebabkan ungkapan itu dikompil semula secara tersirat. Alihkannya ke pemalar.

  • Kompil sekali, padankan berkali-kali
  • Gunakan match? apabila anda hanya memerlukan nilai benar atau palsu
EMAIL = /\A[^@\s]+@[^@\s]+\z/

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

Menangguhkan Kerja

Jangan kira perkara yang mungkin tidak pernah digunakan. Tangguhkannya dengan penilaian malas atau pengawal.

  • Pulangkan hasil lebih awal apabila boleh
  • Kira nilai yang memerlukan banyak sumber hanya apabila diminta
def describe(items)
  return 'empty' if items.empty?
  "#{items.size} items, first is #{items.first}"
end

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

Semakan Ringkas

Uji pengetahuan anda tentang kesesakan.

Rumusan

Anda telah belajar cara membaiki kesesakan yang biasa:

  • Gunakan Set atau cincangan untuk keahlian pantas dan bukannya include?
  • Hapuskan gelung bersarang dan corak N+1 dengan cincangan pramuat
  • Memoisasikan pengiraan mahal dengan ||=
  • Pilih kaedah yang cekap (sum, any?, tally) dan alihkan ungkapan nalar ke luar gelung
  • Tangguhkan atau langkau kerja yang mungkin tidak diperlukan

Sentiasa ukur sebelum dan selepas untuk mengesahkan peningkatan.

Percuma untuk bermula

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 “Kesempitan Lazim” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Ruby Academy, termasuk “Kesempitan Lazim”, 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 “Kesempitan Lazim”?

Percepatkan kod Ruby 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 4 daripada 4.

Berapa lamakah pelajaran “Kesempitan Lazim” 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

  1. Mengukur Prestasi
  2. Alat Pemprofilan
  3. Pengoptimuman Memori
  4. Kesempitan Lazim
← Kembali ke Ruby Academy