「An Introduction to GCC」に載っていた例を実際に試してみた。
環境は CentOS-6.0 で、
- 2.6.32-71.29.1.el6.x86_64 GNU/Linux
- gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)
やったこと
本に載っていた"test.c"をそのまま使い、-O0, -O1, -O2, -O3, -O3 -funroll-loops
の5種類について実行ファイルのサイズとtime
コマンドの結果を求めた。
コンパイルと実行に使ったPerlスクリプトは以下のとおり。
#!/usr/bin/perl # # test.pl # @a = ('-Wall -O0', '-Wall -O1', '-Wall -O2', '-Wall -O3', '-Wall -O3 -funroll-loops'); for($i=0; $i <= $#a; $i++){ print("\[$a[$i]\]\n"); system("gcc $a[$i] test.c && size -B ./a.out && time ./a.out"); print("\n\n"); }
ここで、実行ファイルのサイズを求めるにあたっては、ls -l
ではなくGNU Binutilsのsize
コマンドを使うようにした。size
コマンドはELFファイルの中のセクションごとにサイズを調べてくれるので、.textセクションのサイズも分かる。すなわち最適化による命令の量の変化がより明らかになる。
結果
# ./test.pl > test.log 2>&1 # cat test.log [-Wall -O0] text data bss dec hex filename 1387 492 16 1895 767 ./a.out sum = 4e+38 real 0m1.677s user 0m1.263s sys 0m0.002s [-Wall -O1] text data bss dec hex filename 1329 492 16 1837 72d ./a.out sum = 4e+38 real 0m0.793s user 0m0.735s sys 0m0.003s [-Wall -O2] text data bss dec hex filename 1369 492 16 1877 755 ./a.out sum = 4e+38 real 0m0.457s user 0m0.442s sys 0m0.005s [-Wall -O3] text data bss dec hex filename 1369 492 16 1877 755 ./a.out sum = 4e+38 real 0m0.456s user 0m0.444s sys 0m0.003s [-Wall -O3 -funroll-loops] text data bss dec hex filename 1665 492 16 2173 87d ./a.out sum = 4e+38 real 0m0.503s user 0m0.493s sys 0m0.002s
性能がよいのは-O2
と-O3
で、たぶん同じコード。funroll-loopsの最適化は今回の例では逆効果だった。
サイズを最も小さくできたのは-O1
。
補足:-Osオプション
-Os
オプションを使うとサイズの最適化を行うことができる。これも試した結果、確かにサイズが最も小さくなった。
[-Wall -Os] text data bss dec hex filename 1289 492 16 1797 705 ./a.out sum = 4e+38 real 0m0.575s user 0m0.544s sys 0m0.003s
-Wall -O1
の場合と比較すると、.textセクションのサイズは40バイト減り、実行時間も0.2sくらい減っている。
サイズに関する最適化を見る場合は '-Os'オプション
返信削除も行った方がよいかもしれません。'-Os'オプションは
'-O2'オプションからコードサイズ増加するであろう
最適化を除いたものになります。
あとコードサイズを見る場合は 'size'コマンドを
使用すべきです。sizeコマンドはbinutilsのコマンド
でバイナリの各セクションのサイズが見れます.
コードサイズであれば、textセクションのサイズを
見るとよいでしょう.
実行可能ファイルはシンボルテーブルやらデバッグ
情報等を含んでいます。ls -lで得られるサイズは
その辺の情報も含まれてしまうので、厳密では
ありません。
'size'コマンドと'-Os'オプションを取り入れて修正しました。
返信削除Thanks a lot to syohex.