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