小柳です。こんばんは。 Hidemi KAWAI wrote: > > こんにちは、川合です。 > 一方的にけなして嘆いていてもしょうがないので、とりあえず最初の > 2つの関数だけを書き直してみました。どのくらい改善するのか判明す > れば、この問題をより深く考えられるだろうと思うからです。もちろん > 書き直した関数も全く同じ動作をします(バグがなければ、ですが。一 > 応、go_0020sをコンパイルさせてみて同じオブジェクトファイルを生成 > しているという確認はとりました)。 > > 僕は結局、insn-attrtab.cというソースを次のようにいじりました。 > > ・改変前:全部で40219行。このうちの2493行(6.2%)を改変。 > ・改変後:2493行は1525行にまとまった。これにより圧縮前のサイズで > cc1、cc1plus、osaskgoのいずれにおいても、14KB弱のサイズ縮小が > みられた。アルゴリズムは前よりもいいので、多分コンパイル速度も > 0.1%くらいは改善しているかもしれない。 実際に go をビルドして時間を測って比較してみれば、分かるのでは ありませんか? > 圧縮後のサイズで比較すると差は小さく、 > cc1.exe : 2.0KB > cc1plus.exe : 2.0KB > osaskgo.bin : 3.1KB > となった。 > > これだけの改造に5日もかかってしまいました(このうちの3日はどう > すれば一番効率よくなるかを考えたりテストしたりするためのものでし > た)。5日頑張ってosaskgoが3KBだけ小さくなったと言っても、これは > 喜ぶべきかどうかは微妙ではあります。ただ、gcc由来部分にはまだか > なりの改良の余地があることを実証できたと思います。それについては > 以下をご覧ください。 改良の余地はあると思いますが、時間は非常にかかるように思います。 もし川合さんが今回のペースで、一人で、 > しかしこのinsn-attrtab.cも964KBでしかなく、これはgcc由来部分の > 5.3%でしかありません。もし17.9MBのソースを全てチェックして書き直 > せば、機能的な妥協を全くしなくても、cc1で608KB、osaskgoで912KBの > 減量になります。・・・まあこれはちょっと虫がよすぎる気がするので > (理由は後述)、半分の304KBと456KBということにしましょう。そうだ > とすると、 > > cc1 : 851KB -> 547KB > cc1plus : 1025KB -> 721KB > osaskgo : 1123KB -> 667KB > > という見積もりができます。おそらく、コンパイル速度もサイズに比例 ここまでやると、数年かかることになってしまいます。 サイズを小さくするという目的なら、 ・どの関数のサイズが大きいかどうかを事前に調べる(Linux なら nm コマンド) ・ソースコードにはコメントや空行が含まれているので、それを除いた行数を 調べておく(フリーソフトで実質の行数を数えるものはいくつかあるでしょう。) というように調査したデータから手を入れる場所を考えて効率的にやるべきだと 思います。 -- 小柳 雅明(http://homepage1.nifty.com/dreaming/) 「人の足を止めるのは"絶望"ではなく"諦観" 人の足を進めるのは"希望"ではなく"意志"」 -- ARMS