Common Lispファイルをコンパイルする(Roswell, SBCL)

Roswellでプロジェクトを作ったはいいが、コンパイルするにはどうしたらいいのだろう?
答え:ros initコマンドで作成したスクリプトは、ros buildコマンドでコンパイルできる。 前回前々回で作成したmyapp2プロジェクトを使う。

rosファイルをコンパイルする

コンパイルするには「ros build <rosファイル>」とすればよい。ここで拡張子は「.ros」である必要がある。拡張子が存在しないと何もしないし、ros以外の拡張子では受け付けてくれない。しかも、たぶん、ros initで作成した内容に則した形式である必要がある。例えば第1行が#!で始まるとか。
とにかく「ros build main.ros」を実行してみたのが以下の例だ。なにやらいろんな警告が出た後、拡張子無しの「main」という実行可能ファイルが作成される。

$ cd ~/work/sbcl/myapp2
$ tree
.
|-- README.markdown
|-- README.org
|-- main.ros
|-- myapp2-test.asd
|-- myapp2.asd
|-- src
|   `-- myapp2.lisp
`-- tests
    `-- myapp2.lisp

2 directories, 7 files
$ ros build main.ros

; file: /usr/local/etc/roswell/dump-sbcl.lisp
; (略。警告が結構出力される。)
; compilation unit finished
;   caught 1 STYLE-WARNING condition
compressed 4096 bytes into 1206 at level -1
compressed 4096 bytes into 663 at level -1
compressed 29323264 bytes into 10476494 at level -1
$ 

実行可能ファイルのサイズは約11MB(!)もある。フィボナッチ数列ごときを計算するだけなのにどうしてこんなに大きいのかわからないが、上の表示をみるとこれでも圧縮したのだそうだ。

どのくらい速くなったか確認する

私のPCはノートのCeleron 1.9GHzという骨とう品レベルなので遅い。最近の爆速PCなら一瞬で終わるだろう。

$ time ./main.ros  # スクリプトファイル実行1回目
fib(8)=21

real    0m5.013s
user    0m3.389s
sys     0m1.490s
$ time ./main  # コンパイル済ファイル実行1回目
fib(8)=21

real    0m0.967s
user    0m0.584s
sys     0m0.332s
$ time ./main.ros  # スクリプトファイル実行2回目
fib(8)=21

real    0m1.804s
user    0m1.213s
sys     0m0.550s
$ time ./main  # コンパイル済ファイル実行2回目
fib(8)=21

real    0m0.381s
user    0m0.231s
sys     0m0.146s
$ 

最初の1回目はいつも遅いので、どちらも2回実行し、2回目の結果を比較した。すろと、スクリプトでは1.80秒かかったものがコンパイルすると0.38秒まで早くなった。率にすると約80%の速度アップ!
もっと頻繁にデータベースなど外部にアクセスすればシステム待ちが増え、こんな劇的な改善には至らないだろうと思う。

今回使用したサンプルプロジェクト

An example of Common Lisp Project
https://github.com/kitemw/myapp2