Måle ytelse
Benchmark-modulen
Måle ytelse er en gratis leksjon i Ruby Academy på CoddyKit. Dette er leksjon 1 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.
Hvorfor måle?
Å optimalisere uten å måle er å gjette. Benchmark-modulen i Rubys standardbibliotek måler kode nøyaktig.
- Finn de langsomme delene før du endrer dem
- Sammenlign implementasjoner objektivt
- Unngå for tidlig optimalisering
require 'benchmark'
time = Benchmark.realtime do
1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"Benchmark.measure
Benchmark.measure returnerer en rapport med bruker-, system- og veggklokketid.
- Brukertid er CPU-tiden i koden din
- Veggklokketid er den medgåtte tiden i virkeligheten
require 'benchmark'
result = Benchmark.measure do
500_000.times { |i| i.to_s }
end
puts resultBenchmark.bm
Benchmark.bm kjører og merker flere blokker i en tabell.
- Angi en etikettbredde for justering
- Hver
x.reportutgjør én rad
require 'benchmark'
Benchmark.bm(10) do |x|
x.report('to_s:') { 100_000.times { |i| i.to_s } }
x.report('inspect:') { 100_000.times { |i| i.inspect } }
endBenchmark.bmbm
Benchmark.bmbm kjører først en prøvekjøring for å varme opp cacher og GC, slik at tallene blir mer rettferdige.
- Den første gjennomkjøringen forkastes
- Den andre gjennomkjøringen er den faktiske målingen
require 'benchmark'
Benchmark.bmbm do |x|
x.report('sum:') { (1..100_000).sum }
x.report('reduce:') { (1..100_000).reduce(:+) }
endrealtime for rask tidtaking
Benchmark.realtime returnerer bare sekunder målt med veggklokken, som et flyttall.
- Den enkleste måten å ta tiden på én blokk
- Godt egnet for ad hoc-kontroller
require 'benchmark'
elapsed = Benchmark.realtime do
arr = Array.new(100_000) { rand }
arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"Monoton klokke
For nøyaktig tidtaking som ikke påvirkes av endringer i systemklokken, bruker du Process.clock_gettime med en monoton klokke.
- Upåvirket av NTP-justeringer
- Det mest nøyaktige innebygde alternativet
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
200_000.times { |i| i * i }
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
puts "Elapsed: #{(finish - start).round(4)}s"Sammenligne to tilnærminger
Benchmarker er særlig nyttige når du sammenligner alternativer. Kjør begge under identisk belastning.
- Hold inndatastørrelsen stor nok til at den kan måles
- Gjenta for å redusere støy
require 'benchmark'
arr = (1..100_000).to_a
Benchmark.bm(8) do |x|
x.report('map:') { arr.map { |n| n * 2 } }
x.report('each:') { r = []; arr.each { |n| r << n * 2 } }
endVær forsiktig med mikrobenchmarker
Små benchmarker kan villede.
- JIT og cacher gjenspeiler kanskje ikke virkelige arbeidsbelastninger
- GC kan kjøre midt under målingen
- Mål realistiske datamengder
require 'benchmark'
# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"Iterasjoner per sekund
Ofte er du interessert i gjennomstrømning: hvor mange operasjoner som utføres per sekund. benchmark-ips-gemmen rapporterer dette, men du kan anslå det manuelt.
- Tell iterasjoner i et tidsvindu med fast lengde
- Høyere ips betyr høyere hastighet
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + 0.2
count = 0
while Process.clock_gettime(Process::CLOCK_MONOTONIC) < deadline
count += 1
'hello'.upcase
end
puts "Iterations in 0.2s: #{count}"Kontrollere GC
Søppelsamleren kan påvirke resultatene. Du kan deaktivere den midlertidig for jevnere tall.
GC.disablefør ogGC.enableetter- Bruk dette med forsiktighet for å unngå at minneforbruket vokser
require 'benchmark'
GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"Gjennomsnitt av flere kjøringer
Kjør en benchmark flere ganger og beregn gjennomsnittet for å jevne ut variasjoner.
- Forkast eventuelt den langsomste avvikende målingen
- Rapporter medianen for større stabilitet
require 'benchmark'
times = 3.times.map do
Benchmark.realtime { (1..50_000).map { |n| n * n } }
end
avg = times.sum / times.size
puts "Average: #{avg.round(4)}s"Hurtigsjekk
Test kunnskapen din om benchmarking.
Oppsummering
Du har lært å måle ytelse:
Benchmark-modulen måler kode nøyaktigrealtime,measure,bmogbmbmdekker ulike behov- Bruk den monotone klokken for nøyaktig tidtaking
- Unngå misvisende mikrobenchmarker og ta hensyn til GC
- Beregn gjennomsnittet av flere kjøringer for å redusere støy
Deretter skal du bruke dedikerte profileringsverktøy.
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 «Måle ytelse» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Ruby Academy, inkludert «Måle ytelse», 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 «Måle ytelse»?
Benchmark-modulen 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 1 av 4.
Hvor lang tid tar leksjonen «Måle ytelse»?
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.