Ruby Academy · Lektion

Mät prestanda

Modulen Benchmark.

Lektion 1 av 413 steg

Mät prestanda är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Varför mäta?

Att optimera utan att mäta är att gissa. Modulen Benchmark i Rubys standardbibliotek mäter kod exakt.

  • Hitta de långsamma delarna innan Ni ändrar dem
  • Jämför implementationer objektivt
  • Undvik förtida optimering
require 'benchmark'

time = Benchmark.realtime do
  1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"

Benchmark.measure

Benchmark.measure returnerar en rapport med användar-, system- och verklig tid.

  • Användartid är CPU-tiden i koden
  • Verklig tid är den förflutna tiden enligt väggklockan
require 'benchmark'

result = Benchmark.measure do
  500_000.times { |i| i.to_s }
end
puts result

Benchmark.bm

Benchmark.bm kör och namnger flera block i en tabell.

  • Ange en etikettbredd för justering
  • Varje x.report utgör en 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 kör först en uppvärmningskörning för att värma upp cachar och GC, vilket ger mer rättvisande värden.

  • Den första körningen kastas bort
  • Den andra körningen är den riktiga mätningen
require 'benchmark'

Benchmark.bmbm do |x|
  x.report('sum:') { (1..100_000).sum }
  x.report('reduce:') { (1..100_000).reduce(:+) }
end

realtime för snabb tidtagning

Benchmark.realtime returnerar endast sekunder enligt väggklockan som ett flyttal.

  • Det enklaste sättet att mäta tiden för ett block
  • Bra för tillfälliga kontroller
require 'benchmark'

elapsed = Benchmark.realtime do
  arr = Array.new(100_000) { rand }
  arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"

Monoton klocka

För exakt tidtagning som inte påverkas av ändringar i systemklockan använder Ni Process.clock_gettime med en monoton klocka.

  • Påverkas inte av NTP-justeringar
  • Det mest exakta inbyggda 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"

Jämföra två metoder

Benchmark-tester är särskilt användbara när Ni jämför alternativ. Kör båda under identisk belastning.

  • Håll indata tillräckligt stor för att mätningen ska bli tydlig
  • Upprepa körningen för att minska brus
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

Se upp med mikrobenchmarkar

Små benchmark-tester kan vilseleda.

  • JIT och cachar kanske inte återspeglar verkliga arbetsbelastningar
  • GC kan köras mitt under mätningen
  • Mät realistiska datamängder
require 'benchmark'

# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"

Iterationer per sekund

Ofta vill Ni mäta genomströmning: hur många operationer som utförs per sekund. Gemmet benchmark-ips rapporterar detta, men Ni kan uppskatta det manuellt.

  • Räkna iterationer under ett fast tidsintervall
  • Högre ips betyder snabbare körning
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}"

Styra GC

Garbage collectorn kan förvränga resultaten. Ni kan tillfälligt inaktivera den för jämnare värden.

  • GC.disable före och GC.enable efter
  • Använd detta försiktigt för att undvika att minnesanvändningen växer
require 'benchmark'

GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"

Beräkna medelvärdet av flera körningar

Kör ett benchmark-test flera gånger och beräkna medelvärdet för att jämna ut variationer.

  • Uteslut vid behov det långsammaste avvikande värdet
  • Rapportera medianen för 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"

Snabbkontroll

Testa Era kunskaper om benchmark-tester.

Sammanfattning

Ni har lärt Er att mäta prestanda:

  • Modulen Benchmark mäter kod exakt
  • realtime, measure, bm och bmbm fyller olika behov
  • Använd den monotona klockan för exakt tidtagning
  • Undvik missvisande mikrobenchmarkar och ta hänsyn till GC
  • Beräkna medelvärdet av flera körningar för att minska brus

Därefter använder Ni särskilda profileringsverktyg.

Gratis att börja

Lär dig Ruby med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
109

Vanliga frågor

Är lektionen ”Mät prestanda” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Mät prestanda”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Mät prestanda”?

Modulen Benchmark. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?

Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Mät prestanda”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Ruby Academy-lektionen?

Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Mät prestanda
  2. Profileringsverktyg
  3. Minnesoptimering
  4. Vanliga flaskhalsar
← Tillbaka till Ruby Academy