スクリプトで生成した無茶なコードを g++ でコンパイルすると激遅の件の対応
Scheme のリスト例えば
'(1 2 3 4 5 6 7 8 9 .. 100000まで続く)
を C++ のコードに変換すると
cons(makeInt(1), cons(makeInt(2), cons(makeInt(3), ....)))
と cons 関数の入れ子になるんですが、これがどうも g++ 的につらいらしい。
とにかくコンパイルに時間がかかる。(例えば15分とか)
コンパイラオプション -Os とかにすれば多少速くなったりもするが、焼け石に水という感じ。
何とかだましだましやっていたのですが、昨日遂にコードが大きくなりすぎて g++ が SEGV するようになった。
しょうがないのでコンパイル時には
Object* array = { makeInt(1), makeInt(2), ...};
と配列にしておいて実行時に arrray -> list の変換関数をはさむようにしたらコンパイル速度が劇的に改善した。
この方法はリストが入れ子になっているとちょっと面倒なのですが、それはコード生成スクリプトががんばるということで。