Mät prestanda
Modulen Benchmark.
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 resultBenchmark.bm
Benchmark.bm kör och namnger flera block i en tabell.
- Ange en etikettbredd för justering
- Varje
x.reportutgö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 } }
endBenchmark.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(:+) }
endrealtime 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 } }
endSe 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.disableföre ochGC.enableefter- 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
Benchmarkmäter kod exakt realtime,measure,bmochbmbmfyller 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.
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.