C++ Academy · レッスン

Google Benchmarkによるマイクロベンチマーク

Google Benchmarkで信頼性の高いマイクロベンチマークを記述し、測定上の落とし穴を避けます。

レッスン 4/415 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. キャッシュフレンドリーなデータレイアウト
  2. 分岐予測とホットループ
  3. perf、vtune、Sanitizerによるプロファイリング
  4. Google Benchmarkによるマイクロベンチマーク
← C++ Academyに戻る