ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

google-perftoolsでC++プログラムのプロファイリング

この記事は

 google-perftoolsのcpu profilerを使ってC++プログラムのプロファイリングする時の一連の手順をまとめた記事です。
 ほとんどgoogle-perftoolsの各サブセットのhow toに乗っている事の焼き直しです。

確認した環境

インストール

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"を渡して必要なライブラリをリンクする

だけです。
その他必須ではないがやっておくと良いことは

  • "-g3"とか"-ggdb3"でデバッグシンボルを埋めておく
  • "-fno-inline"でインライン展開を抑制する
  • "-DNDEBUG"でassertとかのデバッグコードを削除

のあたりです。
どういうコードを組んでいるかにもよりますが、-fno-inlineを加えておかないと肝心のパフォーマンスを見たい部分が一つの関数にまとめられてたりします。もちろん、インライン化を抑制するので実行速度は遅くなりますが。
最適化オプションについては必要に応じて定義してください。

プロファイリング結果をkcachegrindで確認

バイナリを生成したあとそのままプログラムを実行するとプロファイリング結果がファイルに吐き出されます。それをgoogle-pprofに食べさせるだけでも結果を確認することはできるのですが、非常に見づらいのでkcachegrindを使って結果を確認します。
確認の手順は以下の通り。なお、実行ファイル名は"hoge"で生成されるプロファイリング結果ファイルは"hoge.prof"とします。

google-pprof --callgrind hoge hoge.prof > hoge.cg
kcachegrind hoge.cg

やっていることとしてはcallgrind用のフォーマットに変換して結果をkcachgrindに食べさせているだけです。この変換時に大量の警告が発生するかもしれませんが特に問題は無いようです。

結果

こんなかんじでグラフィカルに確認できます。コードの行単位でどこに時間がかかったかも確認することができます。

感想とか

すっごく見やすい