Pomiar wydajności
Moduł Benchmark
Pomiar wydajności to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Dlaczego mierzyć
Optymalizowanie bez pomiarów to zgadywanie. Moduł Benchmark w standardowej bibliotece Ruby dokładnie mierzy czas wykonywania kodu.
- Znajdź wolne fragmenty, zanim je zmienisz
- Porównuj implementacje w obiektywny sposób
- Unikaj przedwczesnej optymalizacji
require 'benchmark'
time = Benchmark.realtime do
1_000_000.times { |i| i * 2 }
end
puts "Took #{time.round(4)}s"Benchmark.measure
Benchmark.measure zwraca raport zawierający czas użytkownika, czas systemowy i czas rzeczywisty.
- Czas użytkownika to czas procesora zużyty przez kod
- Czas rzeczywisty to czas, który upłynął na zegarze ściennym
require 'benchmark'
result = Benchmark.measure do
500_000.times { |i| i.to_s }
end
puts resultBenchmark.bm
Benchmark.bm uruchamia wiele bloków i umieszcza ich etykiety w tabeli.
- Przekaż szerokość etykiety, aby wyrównać wpisy
- Każde
x.reportto jeden wiersz
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 najpierw wykonuje przebieg próbny, aby rozgrzać pamięci podręczne i GC, zapewniając bardziej miarodajne wyniki.
- Pierwszy przebieg jest odrzucany
- Drugi przebieg jest właściwym pomiarem
require 'benchmark'
Benchmark.bmbm do |x|
x.report('sum:') { (1..100_000).sum }
x.report('reduce:') { (1..100_000).reduce(:+) }
endrealtime do szybkiego pomiaru
Benchmark.realtime zwraca tylko czas rzeczywisty w sekundach jako liczbę zmiennoprzecinkową.
- Najprostszy sposób mierzenia czasu jednego bloku
- Dobre rozwiązanie do doraźnych sprawdzeń
require 'benchmark'
elapsed = Benchmark.realtime do
arr = Array.new(100_000) { rand }
arr.sort
end
puts "Sorted in #{elapsed.round(4)}s"Zegar monotoniczny
Aby wykonywać precyzyjne pomiary niezależne od zmian zegara systemowego, użyj Process.clock_gettime z zegarem monotonicznym.
- Odporny na korekty NTP
- Najdokładniejsza wbudowana opcja
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"Porównywanie dwóch podejść
Benchmarki są szczególnie przydatne podczas porównywania alternatyw. Uruchamiaj oba rozwiązania przy identycznym obciążeniu.
- Rozmiar danych wejściowych powinien być wystarczająco duży, aby pomiar był możliwy
- Powtarzaj pomiary, aby ograniczyć szum
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 } }
endUwaga na mikropomiary
Małe benchmarki mogą wprowadzać w błąd.
- JIT i pamięci podręczne mogą nie odzwierciedlać rzeczywistych obciążeń
- GC może uruchomić się w trakcie pomiaru
- Mierz realistyczne rozmiary danych
require 'benchmark'
# Too small to be meaningful
t = Benchmark.realtime { 10.times { |i| i + 1 } }
puts "Misleadingly tiny: #{t}s"Iteracje na sekundę
Często potrzebna jest przepustowość, czyli liczba operacji na sekundę. Gem benchmark-ips podaje tę wartość, ale można ją również przybliżyć ręcznie.
- Policz iteracje w ustalonym przedziale czasu
- Wyższa wartość ips oznacza większą szybkość
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}"Kontrolowanie GC
Garbage collector może zniekształcać wyniki. Można go tymczasowo wyłączyć, aby uzyskać stabilniejsze wartości.
GC.disableprzed pomiarem,GC.enablepo nim- Zachowaj ostrożność, aby uniknąć wzrostu zużycia pamięci
require 'benchmark'
GC.disable
t = Benchmark.realtime { 100_000.times { |i| i.to_s } }
GC.enable
puts "Without GC: #{t.round(4)}s"Uśrednianie wielu pomiarów
Uruchom benchmark kilka razy i uśrednij wyniki, aby wygładzić zmienność.
- W razie potrzeby odrzuć najwolniejszy wynik odstający
- Ze względu na stabilność podawaj medianę
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"Szybkie sprawdzenie
Proszę sprawdzić znajomość pomiarów wydajności.
Podsumowanie
Nauczyli się Państwo mierzyć wydajność:
- Moduł
Benchmarkdokładnie mierzy czas wykonywania kodu realtime,measure,bmibmbmsłużą do różnych zastosowań- Do precyzyjnych pomiarów używaj zegara monotonicznego
- Unikaj mylących mikropomiarów i uwzględniaj GC
- Uśredniaj wiele pomiarów, aby ograniczyć szum
W następnej części użyją Państwo dedykowanych narzędzi do profilowania.
Ucz się Ruby dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 29
- Lekcje
- 109
Często zadawane pytania
Czy lekcja „Pomiar wydajności” jest bezpłatna?
Tak — pełny tekst „Pomiar wydajności” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pomiar wydajności”?
Moduł Benchmark Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Pomiar wydajności”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?
Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Pomiar wydajności
- Narzędzia do profilowania
- Optymalizacja pamięci
- Typowe wąskie gardła