デバッグは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