パーサコンビネータを高速化した

例のアレです. 式年遷宮したときの話はこちら.

github.com

最初は軽い気持ちで細々とした最適化をしていたんです.

ちなみにどう最適化するかというと V8 のプロファイラを使って適当に遅そうなところに目星をつけて色々試します.

そんなこんなで Parsimmon*1 より妙に遅い原因を探していたら, ap, left, right (Parsec*2 でいうところの <*>, <*, *>) の実装の効率が悪く, これが主な原因であることがわかりました.

その後, 比較用の JSON パーサ実装を (Parsimmon のものと同等になるように) 改良した結果がこれです.

このあたりで長いこと不明だった諸悪の根源を見つけられてほぼ満足していますが, さらに細々とした最適化を続けました.

処理系によりそうな話になってきたのでこのへんで終わり.

以上です.

*1:先行の JS のパーサコンビネータライブラリ https://github.com/jneen/parsimmon

*2:Haskell のパーサコンビネータライブラリ https://github.com/aslatter/parsec/ 機能はほぼこれのパクリ