Ruby Academy · Lekcja

Pomiar wydajności

Moduł Benchmark

Lekcja 1 z 413 kroki

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 result

Benchmark.bm

Benchmark.bm uruchamia wiele bloków i umieszcza ich etykiety w tabeli.

  • Przekaż szerokość etykiety, aby wyrównać wpisy
  • Każde x.report to 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 } }
end

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

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

Uwaga 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.disable przed pomiarem, GC.enable po 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ł Benchmark dokładnie mierzy czas wykonywania kodu
  • realtime, measure, bm i bmbm sł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.

Bezpłatny start

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

  1. Pomiar wydajności
  2. Narzędzia do profilowania
  3. Optymalizacja pamięci
  4. Typowe wąskie gardła
← Powrót do Ruby Academy