プロファイルが必要な時
作成したプログラムが思ったより性能がでてない!
ボトルネックがどこにあるのか分からないから調べたい!
そんな時にはプロファイリングツールを使いましょう。
google-perftoolのインストール
http://goog-perftools.sourceforge.net/ の下の方のダウンロードページへのリンクからソースコードを落としてきます。
2014/10/11時点の最新版は gperftools-2.2.1.tar.gz。
解凍してからいつもの通りに ./configure,make,make install でインストール。
graphvizのインストール
コマンドライン上だけでgoogle-perftoolを使う分には必要ありませんが、
google-perftoolはコールグラフという視覚的に分かりやすい図を作ってくれます。
この図はdot形式で生成されるので、このdot形式のファイルをepsなどの形式に変換するためのツール「graphviz」もインストールすると良いでしょう。
http://www.graphviz.org/ のDownloadページからソースコードを落としてきます。
また解凍して ./configure,make,make install ですが
ソースコードからインストールしようとすると、依存するライブラリが多いので./configureで文句を言われる可能性大です。
google-perftoolが生成するdotファイルをepsに変換するだけであれば、機能的に必要のないものがほとんどなので無視してmake, make installしましょう。
使い方
google-perftoolインストール先のlibディレクトリをLD_LIBRARY_PATHに追加。
./bash_profileなどに書いておく。
export LD_LIBRARY_PATH=/home/tanaka/lib:$LD_LIBRARY_PATH
プロファイルしたいプログラムのコンパイル時にlibprofiler.soをリンク。
$ g++ -o hoge.exe hoge.cpp -g -lprofiler
出力先の解析ファイル名を指定して、プログラムを実行。
$ export CPUPROFILE=prof.out; ./hoge.exe
PROFILE: interrupts/evictions/bytes = xxx/x/xxxx
これでprof.outが生成されるので、元プログラムと解析ファイルを指定して結果を表示する。
実行時間が掛かっている関数のトップを見てみる。
$ pprof hoge.exe prof.out
Using local file prof.out.
Welcome to pprof! For help, type 'help'.
(pprof) top
Total: 355 samples
286 80.6% 80.6% 286 80.6% __write_nocancel
16 4.5% 85.1% 16 4.5% __read_nocancel
14 3.9% 89.0% 17 4.8% __lseek_nocancel
・
・
・
左から二列目がその関数が占めている実行時間の割合。
__write_nocancelはwrite(2)から最終的に呼ばれる関数なので、このプログラムはwrite(2)がボトルネックになっていることが分かる。
コールグラフの作成
オブジェクトの大きさで実行時間の割合を表して、関数の呼び出し順にフロー図のような形式で視覚的に表示してくれるコールグラフは以下のようにして作成する。
$ pprof --dot hoge.exe prof.out > prof.dot
$ dot -T eps prof.dot > prof.eps
その他のプロファイリングツール
よく使われるものに以下のものがある。
- perf ( Distributionによるが、Linuxカーネル2.6.31以降に標準搭載 )
- gperf ( gccでコンパイルしたプログラムしかプロファイルできない )
- oprofile
yumやapt-getが使える(その権限がある)環境であれば、perfやoprofileなどをインストールして使うのが簡単かもしれない。
(というのも、perfをソースコードから自分のホームディレクトリにインストールしようとしたらconfigureかmakeでめちゃくちゃこけて断念した。。)
google-perftoolはLinux kernel2.6.31以降であれば、ソースからのインストールで特につまづくことが少ないという点で使いやすいような気がする。