コンパイラチューニング中

プロファイラを利用してコンパイラをチューニング中。
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 で手続きを書くとか。