Edited at

C++のベンチマーク用のライブラリであるgoogle/benchmarkを試す

More than 1 year has passed since last update.


環境

OS: Ubuntu 16.04 LTS

google benchmark v1.10


サンプル

今回作成したサンプルは以下のところにある。

https://github.com/shu65/googlebenchmark_sample/tree/v1.0.0


google benchmark のインストール

git clone https://github.com/google/benchmark googlebenchmark

cd googlebenchmark
git checkout v1.1.0 # versionの指定
cmake -DCMAKE_BUILD_TYPE=Release . # releaseでコンパイルする
make
sudo make install

上記のようにすると以下のところにインストールされる。

ライブラリ: /usr/local/lib/libbenchmark.a

ヘッダー: /usr/local/include/benchmark


サンプルについて

以下のところに、今回作成したサンプルがある。

https://github.com/shu65/googlebenchmark_sample/tree/v1.0.0

この中の./src/sample1.cppがgoogle benchmarkのサンプルとなっている。

githubでは以下のコードである。

https://github.com/shu65/googlebenchmark_sample/blob/v1.0.0/src/sample1.cpp

このコードの中では、測定したい関数を複数回実行するというstatic関数を定義し、BENCHMARKというマクロでこれらのstatic関数をベンチマーク実行時に走らせる関数として登録している。

今回、ベンチマーク時に走るstatic関数は以下の2つ。


  • StringCreationBenchmark()

  • StringCopyBenchmark()

そして、最後のBENCHMARK_MAINというマクロでベンチマークを実行するmain関数を定義している。


サンプルのコンパイルと実行

以下のようにサンプルをコンパイルし、実行する。

git clone git@github.com:shu65/googlebenchmark_sample.git

cd googlebenchmark_sample
git checkout v1.0.0
make clean
make
./sample1

このようにコンパイルして実行すると、以下のようにベンチマークの結果が出力される。

Run on (4 X 2501 MHz CPU s)

2017-04-02 07:44:27
---------------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------------
StringCreationBenchmark 8 ns 8 ns 87576122
StringCopyBenchmark 18 ns 18 ns 32842471


注意

以下のように何も実行しない場合、どれくらいのタイムになるかを測定した。

#include <benchmark/benchmark.h>


static void BlankBenchmark(benchmark::State& state) {
while (state.KeepRunning()) {
}
}

BENCHMARK(BlankBenchmark);

static void PauseAndResumeBenchmark(benchmark::State& state) {
while (state.KeepRunning()) {
state.PauseTiming();
state.ResumeTiming();
}
}
BENCHMARK(PauseAndResumeBenchmark);

BENCHMARK_MAIN();

これの実行結果は以下の通り。

Run on (4 X 2501 MHz CPU s)

2017-04-02 12:40:49
---------------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------------
BlankBenchmark 8 ns 8 ns 82399045
PauseAndResumeBenchmark 628 ns 627 ns 977439

このため、私の環境では8 ns以下の実行時間のものはちゃんと測定できてない。

また、PauseTiming()とResumeTiming()を毎回呼び出すようなベンチマークの場合は、628 ns以下はちゃんと測定できない。


まとめ

思ったよりもお手軽にベンチマークができるので、便利そう。