![]() |
|
| Java | Kawa | JavaLisp | |
|---|---|---|---|
| fib 25 | 1.2 | 56.1 | 117.2 |
| tak 18 12 6 | 0.8 | 15.8 | 50.2 |
Javaでは,数値もオブジェクトで表現されるので,実験で行なったようなベン チマークプログラムでは,大量のメモリを消費し,そのほとんどがゴミとなる. 頻繁に使われるある範囲(例えば-1から100)をあらかじめ,アロケートしてメ モリを節約するという手法もあるが,JavaLispでは実装されていない.一方 Javaでは,数値は直値で表されるので,ゴミは発生しない.JavaLispではオブ ジェクトの割付けとゴミ集めのオーバーヘッド頻繁にかかっているものと思わ れる.KawaがJavaLispより遅かったのも同様の理由である.
この直値を使えないという欠点は,実行時間の大きなオーバヘッドとなってお り,たとえJavaLispにコンパイラを追加しても,Javaで直接記述したプログラ ムをコンパイルした場合より高速なコードを生成することは,不可能であると 考えられる.
一方,Kawaはコンパイラでの実験であり,JavaLispはインタプリタである.こ の差が2倍程度しかなかったのは,Kawaは高度な最適化を行ってないなどの理 由が考えられる.
(defun fib (n)
(if (<= n 1)
1
(+ (fib (- n 2)) (fib (1- n)))))
(fib 25)
(defun tak (x y z)
(if (not (< y x))
z
(tak
(tak (1- x) y z)
(tak (1- y) z x)
(tak (1- z) x y))))
(tak 18 12 6)