コンパイラチューニング中
プロファイラを利用してコンパイラをチューニング中。
iform の中から free variables を探す find-free が(予想通り)遅いことが分かった。
ちょっと複雑な手続なので躊躇したが、これを C++ で書き直したところ3割ほど速くなった。
set! を探し出す find-set が同様に遅いので書き直さねば。
以前も書いたかもしれないが、できるだけ処理系に依存せずに速い Scheme のコードを書くためのパターン集が欲しいなと思った。
僕が知っている範囲で例を挙げれば
- メモ化
- vector を dispatch table にしてタグで分岐 (vector-set! v tag番号 (lambda () タグ番号用の処理)) としておいて ((vector-ref v tag番号) ...) と dispatch。
- intenal define の代わりにローカルマクロで強制 inline 化
- できるだけ末尾再帰で書く
- cond に展開した方が速いとあらかじめ分かっている場合 case を使わない
あとは処理系依存っぽいですがインライン化を期待して internal define で手続きを書くとか。