(3F実習室のAIXマシンでは、gcc が正しくインストールされていないため、 gcc では、-pgオプションは使えない)
例
cc -o swap_sort swap_sort.c -pgプログラムを実行すると、gmon.out というファイルができあがる。
swap_sort > /dev/null ls gmon.out gmon.outgprof を起動して、プロファイリングを行なう。出力はかなり大量なので、パ イプを通して、less を使って見ると良い。gprof の使用方法は、
gprof オプション 実行ファイル名 プロファイリングデータファイル(gmon.out)である。
gprof -b swap_sort gmon.out | less
重要なのは、最後の方に表示される、
granularity: each sample hit covers 4 byte(s) Total time: 27.45 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 45.5 12.50 12.50 .__mcount [4] 31.2 21.06 8.56 1 8560.00 13710.00 .swap_sort [3] 18.8 26.21 5.15 18551089 0.00 0.00 .swap [5] 2.0 26.76 0.55 .__stack_pointer [6] 1.1 27.05 0.29 .qincrement1 [7] 1.0 27.33 0.28 .qincrement [8] 0.2 27.39 0.06 20002 0.00 0.00 ._doprnt [9] 0.1 27.43 0.04 .__mcount [11] 0.1 27.45 0.02 .__itrunc [12] 0.0 27.45 0.00 20002 0.00 0.00 .printf [10] 0.0 27.45 0.00 10000 0.00 0.00 .rand [13] 途中省略 0.0 27.45 0.00 1 0.00 0.00 .srand [36] 0.0 27.45 0.00 1 0.00 0.00 .time [37]のような部分である。先頭の行は実行に、27.45秒かかったことを示す。次の表 は、左の桁から、
実行時間(全体に対する %) 実行時間の累積(秒) 実行時間(秒) 関数の実行された回数 1回の関数実行にかかる時間(ミリ秒) 1回の関数実行にかかる時間の合計(ミリ秒) 関数名
を表しており、各関数が何回実行され、どれだけ時間がかかっているかを 調べることができる。自分が使った関数以外の関数も表示されていることがあ るが、それらは、Cの標準関数(printfなど)から呼び出される関数である。
この結果は、同じプログラムについてでも、
が異なれば異なる可能性が高い。ちなみに、別の種類のCPU、別のコンパイ ラにより同じプログラムをコンパイルして、プロファイリングした結果を以下 に示す。プロファイラも異なるので、表示の形式も多少異なる。
Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 51.80 8.07 8.07 1 8070.00 9930.00 swap_sort 36.07 13.69 5.62 mcount 11.94 15.55 1.86 18463766 0.00 0.00 swap 0.19 15.58 0.03 2 15.00 15.00 out_data 0.00 15.58 0.00 1 0.00 9960.00 main 0.00 15.58 0.00 1 0.00 0.00 rand_out