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
./benchAusgabe 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
- Cachefreundliche Datenlayouts
- Branch Prediction und Hot Loops
- Profiling mit perf, VTune und Sanitizern
- Microbenchmarking mit Google Benchmark