Vanlige flaskehalser
Gjør Ruby-kode raskere
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.inspectN+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 totalMemoisering
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.totalVelg riktig metode
Noen Enumerable-metoder er langt raskere enn kjeder av metoder.
sumer bedre enninject(:+)any?avslutter tidlig, i motsetning tilselect.empty?findstopper 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.lastHash-gruppering
group_by og tally aggregerer i én gjennomgang i stedet for å skanne flere ganger.
tallyteller forekomster effektivt- Unngår manuelle telleløkker
words = ['a', 'b', 'a', 'c', 'b', 'a']
puts words.tally.inspectKostnaden 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.inspectLate 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.
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
- Måle ytelse
- Profileringsverktøy
- Minn оптимisering
- Vanlige flaskehalser