C++
benchmark

Google's benchmark lib が便利すぎてやばい

More than 1 year has passed since last update.

https://github.com/google/benchmark

http://google-opensource.blogspot.jp/2014/01/introducing-benchmark.html

benchmark-screenshot

関数とかのベンチマークをサポートしてくれるライブラリ.

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)と出来て, 大体のことはできますね. ストレステストやランダムテストにも使えそうです!

名前がよくない

しかしネーミングセンスは残念ですね… これだと混乱してしまいますし検索でもなかなか引っかからないですね.