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