gprofで重い処理を見極める

デバッグはgdb使えばいいんだけど、重い処理はどうやって見つけるのかなーと思ったらgprofなるものがあることを発見。
テストコードはこんな感じ。
[C] #include
#include
int main(void);
int test_wait(int);
int main(){
printf(“startn”);
int i;
printf(“input no=”);
scanf(“%d”,&i);
test_wait(i);
printf(“endn”);
return 1;
}
int test_wait(int n){
if(n==1 || n==2){
return 1;
}else{
return test_wait(n-1)+test_wait(n-2);
}
}
[/C] まず、前準備として、gccのオプションに-pgをつけてビルドする。

$ gcc -o test test.c -pg

みたいな感じ。
Makefileを使っているときは

./configure CFLAGS=-pg

ってやる。
バイナリを実行すると、gmon.outというファイルができるので、バイナリ終了後(実行中はダメ)、以下のコマンドで内容を確認する。

$ gprof バイナリ名 gmon.out > 出力ファイル

これで、出力ファイルに関数呼び出しの結果が記録される。
・・・のはずだったんだけど、計測時間が常に0.00なんだけど。
sleep()かましてるから0.00ってのはありえんし。
この結果はなぜだ・・・。
※調査結果
sleep()のように、CPU負荷がかからない処理は計測されないことが判明。
下記リンクにあるように、フィボナッチ数列を計算したらちゃんと計測できた。
素晴らしい。
n=40で実行した結果はこんな感じ。

Flat profile:
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
 96.13      2.96     2.96        1     2.96     2.96  test_wait
  4.41      3.10     0.14                             main

チューニングの仕方はいろいろありそうだが、%timeがでかい関数からつぶしていくのが王道じゃないかなー。
http://mikilab.doshisha.ac.jp/dia/seminar/2002/pdf/gprof.pdf ←わかりやすい
http://www.fireproject.jp/feature/gdb/omake/profile.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です