Mosh のコンパイラ高速化で悩み中 - その2
Mosh のコンパイラ高速化で悩み中の続き。
id:koguroさんにアドバイスいただき一晩考えた末、%set-union の呼び出し回数が減らせないかという視点でコードをもう一度読み込むことにした。
いくつか改善出来たのでメモ。
%set-union の呼び出し回数を半減
%set-union の一部は append2 の呼び出しで全く同じ効果が得られていたので改善。これは id:koguro さんのアドバイスによるものです。ありがとうございます。
# 変更前 time% msec calls name 19% 430 8694 %set-union 3% 70 17783 append2 # 変更後 10 210 4347 %set-union 8 170 22130 append2
無駄な append2 を減らす
10 210 4347 %set-union 3 60 22279 append2
set-union, set-intersect を廃止
慎重に慎重にコードを読み進め不要処理を削り set-union が論理的に必要ない構造に書き換えた。
書き換える部分はごく小さな範囲だが、設計というか調査に時間をかけた。
append2 の呼び出しコストが大きくなった。
16 280 22279 append2
sets
set! される lvar のリスト sets は最終的に pass3/$local-ref で INDIRECT を発行するかどうかにだけ使われるので hash-table でも良い。
hash-table であれば
- 長いリストを append していくよりは要素の追加が速い
- これは注意が必要、hash-table はその都度コピー渡しする必要があるので実際に速いかどうかは実装次第。
- memq でチェックするより hash-table-ref する方が圧倒的に速い。
のでやる価値があると思う。
いまここを実装しています。