コンパイラの pass3 速度向上まとめ

  1. psyntax.pp という大きめのライブラリを移植したが Mosh での実行が遅い
  2. パフォーマンスチューニングプロジェクト(一人)を結成。
  3. 方針決め
  4. Mosh のプロファイラを強力にすることが問題解決の近道と判断
  5. プロファイラで無名クロージャを含めて、遅いクロージャがどこに存在しているかがわかるようにした。
  6. append 手続きが多く呼ばれていて遅いことが判明
  7. append はコンパイラの中から呼ばれており、入力される巨大なリストに対して何度も append していることが遅い一因だった
  8. pass3 のコード生成フェーズにおいて append が非効率に実行されているのを改善すべきと気づく。
  9. いくつかの改善案からコンパイル結果の断片を code-builder に put! してコンパイル結果をためる方式を採用。(副作用がある形だが取っ付きやすく、コードの高速化が期待できる)
  10. pass3 をいきなり書き換えるのは怖いので、new-pass3 のコードを書き起こす。
  11. すべてのテストコードに対して pass3 と new-pass3 が全く同じ結果を返すまで修正を続ける
    1. このフェーズで元の pass3 にあったスタック使用量計算ミスのバグが発見される
  12. pass3 と new-pass3 を簡単に切り替えられるようにして、Mosh にくみ込む。
  13. new-pass3 は 30% の速度向上がみられることが分かったので new-pass3 を採用することを決定。
  14. コードを整理
  15. まとめを書く←いまここ