読者です 読者をやめる 読者になる 読者になる

Google-perftoolsを使ってみた

最近僕が作ったプログラムの動作がやたらと遅いので、Google-perftoolsを使って、プロファイリングしてみることにしました。

Google-perftoolsを使ってCPUプロファイリングをとる - PS3 Linux Information Site / Cell/B.E.のパワーを体験しようを参考にさせていただきました。

インストール

OSには、Vine Linux 4.0を利用。

$ tar xvfz google-perftools-0.91.tar.gz
$ cd google-perftools-0.91
$ ./configure
$ make

で、make完了と思ったら、リンクのところでこんなエラーが。

libtcmalloc.so
./.libs/libtcmalloc.so: undefined reference to `___tls_get_addr'
collect2: ld returned 1 exit status
make: *** [heap-profiler_unittest] Error 1

  • src/config.hを開いて、120行目をコメントアウトする。
#define HAVE_TLS 1//#define HAVE_TLS 1
  • 再度makeしたら成功。

$ make
$ su
# make install

  • パスを通します。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
$ export CPUPROFILE=prof.out

  • dotがないので、aptでインストール。

# apt-get install graphviz

以上でインストール完了( ^ω^ )

プロファイル

使い方は至って簡単。

  • Autotoolsを使っているので、Makefile.amのリンカオプションに-lprofilerを追加する。
  • ビルドする。
  • 実行ファイルを叩くと、prof.outが生成されている。
  • 解析結果を見る。

$ pprof a.out prof.out
(pprof) top

  • なんか、関係のない関数が上位占めてたので、プロファイルをとる範囲を絞ることに。
  • プロファイルをとりたいファイルに、#includeを追加。
  • プロファイルをとりたい箇所をProfilerStartとProfilerStopで囲む。
ProfilerStart("prof.out");
 :
 :
ProfilerStop();
  • で結果を見たところ、一個の関数に98.6%も処理時間費やしてました。ここ直さんとな。

所感

  • リンクするだけで使えるし、プロファイルをとるところを指定できるので使いやすい。
  • 画像ファイルを生成すると、処理時間の多い関数が大きく表示されるので分りやすい。
  • よく見たら、Vine Linux - VineSeedGoogle-perftoolsのRPMファイルあるやん Σ(゚Д゚)