0Pricing
C++ Academy · Lektion

Microbenchmarking mit Google Benchmark

Schreiben Sie zuverlässige Microbenchmarks mit Google Benchmark und vermeiden Sie typische Messfehler.

Microbenchmarking mit Google Benchmark ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Microbenchmarks?

Makro-Profiling zeigt, wofür Zeit aufgewendet wird. Microbenchmarks messen bestimmten Code isoliert – nützlich zum Vergleichen von Algorithmen oder Implementierungen.

Google-Benchmark-Einrichtung

Eine mehr oder weniger Header-only-C++-Benchmarkbibliothek von Google. Installieren Sie sie über vcpkg, Conan oder apt und linken Sie mit -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();

Kompilieren und Ausführen

Kompilieren Sie mit aktivierter Optimierung, linken Sie die Benchmarkbibliothek und führen Sie das Programm aus.

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

Ausgabe interpretieren

Die Bibliothek gibt die Zeit pro Iteration, die Anzahl der Iterationen und die CPU-Zeit aus. Vergleichen Sie Baselines mit den geplanten Änderungen.

Optimizer-Tricks vermeiden

Der Optimizer kann nutzlosen Code entfernen. Verwenden Sie benchmark::DoNotOptimize, um das Ergebnis zu erzwingen und sicherzustellen, dass es „relevant“ ist.

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

Dead Stores verhindern

benchmark::ClobberMemory teilt dem Compiler mit, dass der Speicherzustand beobachtet wurde, und verhindert so die Entfernung von Speicherzugriffen.

Parametrisierte Benchmarks

Testen Sie dieselbe Funktion mit unterschiedlich großen Eingaben.

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);

Multithreaded Benchmarks

Testen Sie die Skalierbarkeit mit dem Modifikator Threads.

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

Benutzerdefinierte Zähler

Erfassen Sie domänenspezifische Metriken wie Byte/s oder Elemente/s.

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

Statistische Ausgabe

Führen Sie das Programm mit --benchmark_repetitions=10 aus, um Mittelwert, Median und Standardabweichung zu erhalten. Die Bibliothek gibt diese automatisch aus.

Häufige Fallstricke

Achten Sie auf:

  • Das Entfernen von „totem“ Code durch den Compiler → verwenden Sie DoNotOptimize
  • Aufwärmeffekte → messen Sie viele Iterationen
  • Skalierung der CPU-Frequenz → pinnen Sie den Kern und deaktivieren Sie den Boost
  • Andere laufende Prozesse → führen Sie den Benchmark auf einem möglichst ungestörten Rechner aus

Zahlen kritisch beurteilen

Eine Verbesserung um 5 % kann Messrauschen sein. Führen Sie mehrere Wiederholungen aus und vertrauen Sie nur statistisch signifikanten Unterschieden. Vergleichen Sie mit einer bekannten Baseline.

Alternativen

Weitere Microbenchmark-Tools:

  • Nonius – Header-only-C++-Benchmark
  • Hayai – älter, aber leichtgewichtig
  • Catch2 bietet integrierte Benchmark-Unterstützung

Schnelltest

Warum verwenden Sie benchmark::DoNotOptimize(result) innerhalb einer Benchmark-Schleife?

Zusammenfassung

Verwenden Sie Google Benchmark für detaillierte Messungen. Verhindern Sie Compiler-Optimierungen mit DoNotOptimize und ClobberMemory. Verwenden Sie parametrisierte und Multithreaded Benchmarks, um das Verhalten bei unterschiedlichen Eingaben und unter nebenläufiger Ausführung zu untersuchen. Vertrauen Sie nur statistisch signifikanten Unterschieden.

Häufig gestellte Fragen

Ist die Lektion „Microbenchmarking mit Google Benchmark“ kostenlos?

Ja — der vollständige Text von „Microbenchmarking mit Google Benchmark“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Microbenchmarking mit Google Benchmark“?

Schreiben Sie zuverlässige Microbenchmarks mit Google Benchmark und vermeiden Sie typische Messfehler. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Microbenchmarking mit Google Benchmark“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Cachefreundliche Datenlayouts
  2. Branch Prediction und Hot Loops
  3. Profiling mit perf, VTune und Sanitizern
  4. Microbenchmarking mit Google Benchmark
← Zurück zu C++ Academy