Mosh のコンパイラ高速化で悩み中

問題点と目標

psyntax.pp の実行に 3 sec かかるが 500msec にしたい。

プロファイラ結果

実行時間の 27% を %set-union の実行が占めておりこれを改善すれば速度向上が見込める

%set-unionとは何か?

2つのリストを引数にとり和集合を返す手続き。
結果として返るリストは新しくアロケートされたものである。(後述の使われ方ではリストが新しくアロケートされることが必要とされている)

%set-union はどこで使われているか?

pass3/$lambda や pass3/$let で使われている。
pass3 中は free variable の候補となる変数をリストとして保持し、引数で各処理に渡している。
「free variable の候補となる変数をリスト」は、find-free という手続きで使われる。この手続きはある lambda 式の中にある free variable を探し出すという手続きである。
「free variable の候補となる変数のリスト」は lambda や let の中に入るたびに更新されて増えていく。lambda の仮引数は、lambdaの body の中にある lambda にとって free variable だからである。

速くする方法候補

思いつくままに列挙する。すでに実施済みのものもある。

  • %set-union を C++ で書き直す(実施済み)
  • %set-union のアルゴリズムを memq を使用するものからハッシュを使うものに変更(実施済み)
  • %set-union の呼ばれる回数を減らす方法を考える
  • %set-union で「free variable の候補となる変数のリスト」を作らなくても良いような free variable の管理方法を考える
    • free variables の lookup を独立して行わず parse のときにやってしまうとか。(最適化のあとじゃないとだめじゃん)

うーん。どうしよう。良い方法思いつかない。コンパイラのソース
しばらく寝かすかな。