関数とかのベンチマークをサポートしてくれるライブラリ.
C++11 機能(より正確には -std=c++0x)を使っているので新しめの C++ コンパイラでないと動きません.
使い方は至って簡単で, ユニットテストのように, ベンチマークで計測したい関数を適当に benchmark::State を引数に取るようにして, マクロで呼び出しの指示を与えます.
#include "benchmark/benchmark.h"
static void BM_LongTest(benchmark::State& state) {
double tracker = 0.0;
while (state.KeepRunning())
for (int i = 0; i < state.range_x(); ++i)
tracker += i;
CHECK(tracker != 0.0);
}
BENCHMARK(BM_LongTest)->Range(1<<16,1<<28);
int
main(
int argc,
const char** argv)
{
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
return EXIT_SUCCESS;
}
これだと Range により, 2^16 ~ 2^28 の間でよろしく値のパターンを振って MB_LongTest を呼び出してくれます.
出力は以下のようにしてこれもよろしくレポートしてくれます.
Reading /proc/self/cputime_ns failed. Using getrusage().
Benchmarking on 1 X 2297.19 MHz CPU
2014/02/05-03:06:36
DEBUG: Benchmark Time(ns) CPU(ns) Iterations
--------------------------------------------------------
DEBUG: BM_LongTest/64k 219496 221310 2268
DEBUG: BM_LongTest/256k 871541 880878 574
DEBUG: BM_LongTest/2M 7076118 7158361 72
DEBUG: BM_LongTest/16M 62749889 63467500 8
DEBUG: BM_LongTest/128M 894819972 902404000 1
DEBUG: BM_LongTest/256M 1793205019 1809572000 1
特定の値を指定して関数を呼び出したり(Arg), スレッドの数を指定して関数を呼び出したり(Threads)と出来て, 大体のことはできますね. ストレステストやランダムテストにも使えそうです!
名前がよくない
しかしネーミングセンスは残念ですね… これだと混乱してしまいますし検索でもなかなか引っかからないですね.