Ruby Academy · leksjon

Måle ytelse

Benchmark-modulen

Leksjon 1 av 413 trinn

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 result

Benchmark.bm

Benchmark.bm kjører og merker flere blokker i en tabell.

  • Angi en etikettbredde for justering
  • Hver x.report utgjø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 } }
end

Benchmark.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(:+) }
end

realtime 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 } }
end

Væ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.disable før og GC.enable etter
  • 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øyaktig
  • realtime, measure, bm og bmbm dekker 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.

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 «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.

Alle leksjonene i dette kurset

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