Ruby Academy · leksjon

Vanlige flaskehalser

Gjør Ruby-kode raskere

Leksjon 4 av 413 trinn

Vanlige flaskehalser er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Ruby Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Gjenkjenne flaskehalser

De fleste Ruby-forsinkelser skyldes noen få gjentakende mønstre. Når du kjenner dem igjen, kan du rette koden raskt.

  • Feil datastruktur for oppgaven
  • Gjentatt arbeid som kunne vært bufret
  • N+1-spørringer og nøstede løkker

I denne leksjonen går vi gjennom de vanligste synderne.

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

Array#include? kontra Set

Medlemskapssjekk med Array#include? har kompleksiteten O(n). En Set (eller hash) gir oppslag med kompleksiteten O(1).

  • Ved gjentatte medlemskapssjekker bør du opprette en Set én gang
  • Gir en stor hastighetsforbedring for store samlinger
require 'set'

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

Nøstede løkker (O(n i andre))

Det er kvadratisk å sammenligne hvert elementpar, og tidsbruken eksploderer når størrelsen øker.

  • Erstatt indre løkker med et hash-oppslag
  • Endrer O(n i andre) til 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

N+1-mønsteret

Når du henter relaterte data inne i en løkke, fører det til N+1 operasjoner.

  • Én spørring for listen og deretter én per element
  • Samle oppslagene i stedet ved å hente alt gruppert i én spørring
# 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

Memoisering

Det er tidkrevende å beregne den samme kostbare verdien på nytt. Memoiser den med ||=.

  • Bufre resultatet etter den første beregningen
  • Etterfølgende kall returnerer resultatet umiddelbart
class Report
  def total
    @total ||= begin
      puts 'computing...'
      (1..1000).sum
    end
  end
end

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

Velg riktig metode

Noen Enumerable-metoder er langt raskere enn kjeder av metoder.

  • sum er bedre enn inject(:+)
  • any? avslutter tidlig, i motsetning til select.empty?
  • find stopper ved første treff
nums = (1..1_000_000)
puts nums.any? { |n| n > 5 }
puts nums.find { |n| n > 5 }

Unngå gjentatt sortering

Det er kostbart å sortere inne i en løkke eller flere ganger. Sorter én gang og gjenbruk resultatet.

  • Sortering har kompleksiteten O(n log n)
  • Bufre det sorterte resultatet hvis dataene er stabile
data = [5, 2, 8, 1, 9]
sorted = data.sort
puts sorted.first
puts sorted.last

Hash-gruppering

group_by og tally aggregerer i én gjennomgang i stedet for å skanne flere ganger.

  • tally teller forekomster effektivt
  • Unngår manuelle telleløkker
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspect

Kostnaden ved å bygge strenger

Det er raskere å slå sammen en samling med join enn å konkatene­

parts = (1..5).map { |i| "item#{i}" }
puts parts.join(', ')

Kompilering av regulære uttrykk

Hvis du definerer et regulært uttrykk som literal inne i en varm løkke, kompileres det implisitt på nytt. Flytt det til en konstant.

  • Kompiler én gang og utfør mange treff
  • Bruk match? når du bare trenger en boolsk verdi
EMAIL = /\A[^@\s]+@[^@\s]+\z/

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

Late beregninger

Ikke beregn noe du kanskje aldri kommer til å bruke. Utsett beregningen med lat evaluering eller vaktbetingelser.

  • Returner tidlig når det er mulig
  • Beregn tunge verdier bare ved behov
def describe(items)
  return 'empty' if items.empty?
  "#{items.size} items, first is #{items.first}"
end

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

Rask sjekk

Test kunnskapene dine om flaskehalser.

Oppsummering

Du har lært å løse vanlige flaskehalser:

  • Bruk Set eller hash for raske medlemskapssjekker i stedet for include?
  • Fjern nøstede løkker og N+1-mønstre med forhåndslastede hasher
  • Memoiser kostbare beregninger med ||=
  • Velg effektive metoder (sum, any?, tally) og flytt regulære uttrykk ut av løkker
  • Utsett eller hopp over arbeid du kanskje aldri trenger

Mål alltid før og etter for å bekrefte gevinsten.

Gratis å komme i gang

Lær deg Ruby med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
29
Leksjoner
109

Ofte stilte spørsmål

Er leksjonen «Vanlige flaskehalser» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Vanlige flaskehalser», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Ruby Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Vanlige flaskehalser»?

Gjør Ruby-kode raskere Du øver på Ruby Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Ruby Academy?

Ingen tidligere erfaring er nødvendig. Ruby Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Vanlige flaskehalser»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Ruby Academy-leksjonen?

Ja. Alle Ruby Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Måle ytelse
  2. Profileringsverktøy
  3. Minn оптимisering
  4. Vanlige flaskehalser
← Tilbake til Ruby Academy