LoginSignup
29
28

More than 5 years have passed since last update.

[プロファイル]プログラムで時間が掛かっている場所を特定する(google-perftool)

Last updated at Posted at 2014-10-11

プロファイルが必要な時

作成したプログラムが思ったより性能がでてない!
ボトルネックがどこにあるのか分からないから調べたい!

そんな時にはプロファイリングツールを使いましょう。

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以降であれば、ソースからのインストールで特につまづくことが少ないという点で使いやすいような気がする。

29
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
28