C++ Academy · Lekcja

Mikrobenchmarking z Google Benchmark

Pisz wiarygodne mikrobenchmarki za pomocą Google Benchmark i unikaj pułapek pomiarowych

Lekcja 4 z 415 kroki

Mikrobenchmarking z Google Benchmark to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 4 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 C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Dlaczego mikrobenchmarki

Profilowanie makro pokazuje, gdzie tracony jest czas. Mikrobenchmarki mierzą konkretny kod w izolacji — są przydatne do porównywania algorytmów lub implementacji.

Konfiguracja Google Benchmark

Niemal wyłącznie nagłówkowa biblioteka benchmarków C++ firmy Google. Zainstaluj ją za pomocą vcpkg, Conan lub apt; połącz z -lbenchmark.

#include <benchmark/benchmark.h>

static void BM_StringCopy(benchmark::State& state) {
    std::string s = "Hello, World!";
    for (auto _ : state) {
        std::string copy(s);
    }
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();

Kompilowanie i uruchamianie

Skompiluj program z optymalizacją, połącz go z biblioteką benchmarków i uruchom.

g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench

Interpretacja wyników

Biblioteka wyświetla czas na iterację, liczbę iteracji i czas procesora. Porównuj wartości bazowe z proponowanymi zmianami.

Unikanie sztuczek optymalizatora

Optymalizator może usunąć niepotrzebny kod. Użyj benchmark::DoNotOptimize, aby wymusić, by wynik „miał znaczenie”.

for (auto _ : state) {
    auto result = expensive_function();
    benchmark::DoNotOptimize(result);
}

Zapobieganie martwym zapisom

benchmark::ClobberMemory informuje kompilator, że stan pamięci został odczytany — zapobiega usuwaniu zapisów.

Benchmarki sparametryzowane

Testuj tę samą funkcję dla różnych rozmiarów danych wejściowych.

static void BM_Sort(benchmark::State& state) {
    std::vector<int> v(state.range(0));
    std::iota(v.rbegin(), v.rend(), 0);
    for (auto _ : state) {
        auto copy = v;
        std::sort(copy.begin(), copy.end());
    }
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);

Benchmarki wielowątkowe

Testuj skalowalność za pomocą modyfikatora Threads.

BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);

Niestandardowe liczniki

Śledź metryki specyficzne dla domeny, takie jak bajty/s lub elementy/s.

state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));

Wyniki statystyczne

Uruchom program z opcją --benchmark_repetitions=10, aby uzyskać średnią, medianę i odchylenie standardowe. Biblioteka zgłasza je automatycznie.

Typowe pułapki

Zwróć uwagę na:

  • Usuwanie przez kompilator „martwego” kodu → użyj DoNotOptimize
  • Wpływ rozgrzewania → mierz wiele iteracji
  • Skalowanie częstotliwości procesora → przypnij program do rdzenia i wyłącz tryb boost
  • Uruchomione inne procesy → wykonuj benchmark na nieobciążonym komputerze

Krytyczna analiza wyników

Poprawa o 5% może być tylko szumem pomiarowym. Wykonaj wiele powtórzeń; uznawaj za wiarygodne tylko różnice istotne statystycznie. Porównuj wyniki ze znaną wartością bazową.

Alternatywy

Inne narzędzia do mikrobenchmarków:

  • Nonius — nagłówkowy benchmark C++
  • Hayai — starszy, ale lekki
  • Catch2 ma wbudowaną obsługę benchmarków

Szybki test

Dlaczego używa się benchmark::DoNotOptimize(result) wewnątrz pętli benchmarku?

Podsumowanie

Używaj Google Benchmark do szczegółowych pomiarów. Zapobiegaj sztuczkom kompilatora za pomocą DoNotOptimize i ClobberMemory. Korzystaj z benchmarków sparametryzowanych i wielowątkowych, aby badać zachowanie dla różnych danych wejściowych i poziomów współbieżności. Uznawaj za wiarygodne tylko różnice istotne statystycznie.

Bezpłatny start

Ucz się C++ 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
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Mikrobenchmarking z Google Benchmark” jest bezpłatna?

Tak — pełny tekst „Mikrobenchmarking z Google Benchmark” 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 C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Mikrobenchmarking z Google Benchmark”?

Pisz wiarygodne mikrobenchmarki za pomocą Google Benchmark i unikaj pułapek pomiarowych Ćwiczysz C++ 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ąć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ 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 4 z 4.

Ile czasu zajmuje lekcja „Mikrobenchmarking z Google Benchmark”?

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 C++ Academy?

Tak. Każda lekcja C++ 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. Układy danych przyjazne dla pamięci podręcznej
  2. Przewidywanie rozgałęzień i gorące pętle
  3. Profilowanie za pomocą perf, VTune i sanitizerów
  4. Mikrobenchmarking z Google Benchmark
← Powrót do C++ Academy