kiyoka.2010_03_18 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2010_03
555555555555555555555555555555555555555
5

[Nendo] 初期化スクリプトをコンパイル済にして高速化した

5

私がRubyで書いているLisp方言、 Nendoについて。

5

 

5

Nendoにはinit.nndという起動直後に読み込まれる初期化スクリプトがある。

5

中身はNendoのソースコードで、caar や caaar や let1、cond、caseなどの基本的な構文が定義してある。

5

0.2.0の時点で約600行のソースだ。

5

 

5

このファイルの読み込みが重いという問題があったのだが、かなりad-hocな方法で解決した。

5

Nendoの処理系はもともと Nendo(Lisp言語)を読み込むと、それと等価なRubyコードにトランスレートして実行する仕組みを持っている。

5

今回 init.nnd の読み込みが重いのは、パース、マクロ展開、Rubyコードへのトランスレートという非常に重いプロセスが済んだ init.nndc(コンパイル済ファイル)というファイルを生成するようにした。(拡張子のネーミングは Emacsの .el と .elc と同様にUNIXで一般的なルールです)

5

察しの通り init.nndc は生成したRubyコードが入っている。

5

 

5

さて、どれくらいの差があるか計測してみよう。

5

計測に使ったマシンは PowerBook G4 (PowerPC 1GHz) の非常に時代遅れなマシン。

5

 

5

ちなみに nop.nnd は中身がコメントのみで関数呼び出しも何もないファイル。

5
;;-*- mode: nendo; syntax: scheme -*-;;
5
;; Nothing to do.
5

 

5

 

5
init.nnd (コンパイルなし)
5
bash-3.2$ time nendo nop.nnd
5
5
real    0m10.462s
5
user    0m9.550s
5
sys     0m0.280s
5

 

5
init.nndc (コンパイル済)
5
bash-3.2$ time nendo nop.nnd
5
5
real    0m0.809s
5
user    0m0.636s
5
sys     0m0.110s
5

 

5

コンパイルしないと、起動に10秒もかかってしまってしまう。

5

最初にNendoをさわった人はここで見向きもしなくなるだろうが、コンパイル済であれば、まあギリギリOKの範囲だろう。

5

0.2.0のリリース版は自動的にコンパイル済の初期化スクリプトが選択されるようになっていますので御安心を。

5

 

5

...comment disabled...