Google Benchmarkによるマイクロベンチマーク
Google Benchmarkで信頼性の高いマイクロベンチマークを記述し、測定上の落とし穴を避けます。
「Google Benchmarkによるマイクロベンチマーク」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
なぜマイクロベンチマークを行うのか
マクロプロファイリングでは、時間がどこで使われているかが分かります。マイクロベンチマークでは、特定のコードを単独で測定します。アルゴリズムや実装を比較するのに役立ちます。
Google Benchmarkのセットアップ
Googleが提供する、ほぼヘッダーオンリーのC++ベンチマークライブラリーです。vcpkg、Conan、またはaptでインストールし、-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();コンパイルと実行
最適化を有効にしてコンパイルし、ベンチマークライブラリーをリンクして実行します。
g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench出力の解釈
ライブラリーは、反復ごとの時間、反復回数、CPU時間を出力します。提案した変更をベースラインと比較します。
オプティマイザーのいたずらを避ける
オプティマイザーは、不要なコードを削除することがあります。benchmark::DoNotOptimizeを使って、結果を「意味のあるもの」として扱わせます。
for (auto _ : state) {
auto result = expensive_function();
benchmark::DoNotOptimize(result);
}デッドストアを防ぐ
benchmark::ClobberMemoryは、メモリーの状態が観測されたことをコンパイラーに伝え、ストアの削除を防ぎます。
パラメーター化されたベンチマーク
異なる入力サイズで同じ関数をテストします。
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);マルチスレッドベンチマーク
Threads修飾子を使って、スケーラビリティをテストします。
BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);カスタムカウンター
バイト毎秒やアイテム毎秒など、ドメイン固有のメトリクスを追跡します。
state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));統計的な出力
--benchmark_repetitions=10を指定して実行すると、平均値、中央値、標準偏差を取得できます。ライブラリーがこれらを自動的に報告します。
よくある落とし穴
次の点に注意してください。
- コンパイラーが「デッド」コードを削除する → DoNotOptimizeを使う
- ウォームアップの影響 → 多くの反復を測定する
- CPU周波数のスケーリング → コアを固定し、ブーストを無効にする
- 他のプロセスが実行されている → 負荷の少ないマシンでベンチマークする
数値を批判的に読む
5%の改善は、測定ノイズかもしれません。複数回繰り返し、統計的に有意な差だけを信頼してください。既知のベースラインと比較します。
代替ツール
その他のマイクロベンチマークツール:
- Nonius — ヘッダーオンリーのC++ベンチマーク
- Hayai — 古いものですが軽量
- Catch2 — ベンチマーク機能を内蔵
理解度チェック
ベンチマークループ内でbenchmark::DoNotOptimize(result)を使うのはなぜですか。
まとめ
細かい単位の測定にはGoogle Benchmarkを使います。DoNotOptimizeとClobberMemoryで、コンパイラーによる意図しない最適化を防ぎます。パラメーター化されたベンチマークやマルチスレッドベンチマークを使い、入力や並行性による挙動を調べます。統計的に有意な差だけを信頼してください。
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「Google Benchmarkによるマイクロベンチマーク」レッスンは無料ですか?
はい。「Google Benchmarkによるマイクロベンチマーク」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「Google Benchmarkによるマイクロベンチマーク」で何を学びますか?
Google Benchmarkで信頼性の高いマイクロベンチマークを記述し、測定上の落とし穴を避けます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Google Benchmarkによるマイクロベンチマーク」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- キャッシュフレンドリーなデータレイアウト
- 分岐予測とホットループ
- perf、vtune、Sanitizerによるプロファイリング
- Google Benchmarkによるマイクロベンチマーク