google-perftoolsでC++プログラムのプロファイリング
この記事は
google-perftoolsのcpu profilerを使ってC++プログラムのプロファイリングする時の一連の手順をまとめた記事です。
ほとんどgoogle-perftoolsの各サブセットのhow toに乗っている事の焼き直しです。
公式へのリンクとか
google-perftools : https://code.google.com/p/gperftools/
cpu profiler : http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html
インストール
apt-getで"libgoogle-perftools-dev"と"kcachegrind"をインストールするだけ。
kcachegrindはプロファイリング結果を確認するのに使います
$sudo apt-get install google-perftools libgoogle-perftools-dev kcachegrind
プログラムのソースに手を加える
プロファイリングできるようにするためにプログラムに手を加えます。
#include <google/profiler.h> . . . int main(void){ ProfilerStart("hoge.prof"); . . . //この区間にパヒョーマンスを計りたいコードを書く . . . ProfilerStop(); }
重要なのは
- profiler.hをインクルードする
- ProfilerStart()-ProfilerStop()で囲む
の二点だけです。とっても簡単。
ProfilerStart()に渡している文字列はプロファイリング結果が出力されるファイルの名前です。
makefileに手を加える
必須なのは
-
- リンク時に"-lprofiler"を渡して必要なライブラリをリンクする
だけです。
その他必須ではないがやっておくと良いことは
のあたりです。
どういうコードを組んでいるかにもよりますが、-fno-inlineを加えておかないと肝心のパフォーマンスを見たい部分が一つの関数にまとめられてたりします。もちろん、インライン化を抑制するので実行速度は遅くなりますが。
最適化オプションについては必要に応じて定義してください。
プロファイリング結果をkcachegrindで確認
バイナリを生成したあとそのままプログラムを実行するとプロファイリング結果がファイルに吐き出されます。それをgoogle-pprofに食べさせるだけでも結果を確認することはできるのですが、非常に見づらいのでkcachegrindを使って結果を確認します。
確認の手順は以下の通り。なお、実行ファイル名は"hoge"で生成されるプロファイリング結果ファイルは"hoge.prof"とします。
google-pprof --callgrind hoge hoge.prof > hoge.cg kcachegrind hoge.cg
やっていることとしてはcallgrind用のフォーマットに変換して結果をkcachgrindに食べさせているだけです。この変換時に大量の警告が発生するかもしれませんが特に問題は無いようです。
感想とか
すっごく見やすい