Mosh にコンパイル結果をキャッシュする機能を追加

Mosh に auto-compile-cache をつけました。この機能では実行の高速化が目的に読み込んだライブラリのコードのコンパイル結果をファイル上に自動でキャッシュしておく。
例えば mrc.mgg さんが開発している nausicaa という巨大な R6RS ライブラリがある。以下のように1度目の実行時には 1.8 秒かかっていたものが 2回目以降はキャッシュを参照することにより 0.15 秒と実行速度が速くなっていることが分かる。

;; 1回目
% time ./mosh --loadpath=nausicaa/scheme/src/libraries/ nausicaa/scheme/tests/test-recursion.sps
*** testing recursion

; *** checks *** : 1 correct, 0 failed.

;; 2回目	
./mosh --loadpath=nausicaa/scheme/src/libraries/   1.71s user 0.03s system 95% cpu 1.821 total
sewashi% time ./mosh --loadpath=nausicaa/scheme/src/libraries/ nausicaa/scheme/tests/test-recursion.sps
*** testing recursion

; *** checks *** : 1 correct, 0 failed.
./mosh --loadpath=nausicaa/scheme/src/libraries/   0.11s user 0.04s system 93% cpu 0.158 total

キャッシュは自動的に $(HOME)/.mosh ディレクトリに保存され、自動的に更新される。
この機能を OFF にしたい場合は --disable-acc を利用する。
キャッシュの削除は --clean-acc 。

余談

この機能の --disable-acc などのオプション名は Ypsilon を参考にさせていただきました。
あと上記の例で1回目の実行で 1.8 秒かかっているのだけど、これは以前は数十秒かかっていた。
これを素の状態でまず 1.8 秒で終わるようにして、更に auto-compile-cache の機能をつけたので実装に時間がかかってしまった。
nausicaa は結構巨大なライブラリで、数十ファイルのライブラリをコンパイルするので、auto-compile-cache はかなり有効。


以前は Mosh のビルド時に組み込みライブラリをプリコンパイルしていたが、徐々に auto-compile-cache に移行してこうと思う。
auto-compile-cache の良いところはユーザーが全くその存在を気にしなくて良いことだ。production 環境にコピーされるような正式なバイナリ形式ではなくあくまでもキャッシュだから、仕様がどう変わろうが関係ない。キャッシュをクリアして再構築すれば良いだけだ。