Path: titcca!ccut!ascgw!necspl!spls34!yosikawa From: yosikawa@ccs.mt.nec.junet (Masazumi Yoshikawa) Newsgroups: fj.lang.lisp Subject: Re: CLOS performance. (In Japanese/Kanji) Message-ID: Date: 5 Mar 90 12:19:07 GMT References: <187@ognews1.osakagas.co.jp> Sender: news@spls34.ccs.mt.nec.co.jp Distribution: fj Organization: NEC C&C Common Software Dev. Lab., Tokyo, Japan. Lines: 85 In-reply-to: nakatani@ognews1.osakagas.co.jp's message of 2 Mar 90 08:28:52 GMT In article <187@ognews1.osakagas.co.jp> nakatani@ognews1.osakagas.co.jp (Kosuke NAKATANI) writes: |このニュースグループは初めてです。 |中谷@大阪ガス・基盤研究所と申します。 |どうぞよろしくお願い致します。 よろしくお願いします. |実は、CLOS を使ってみたくて、PCL を入手し、インストールしてみました。 |環境は、SONY/NEWS1850 + KCL です。 ... |両者を比べると実に10倍以上の差があるのですが、これはどういう理由によ |るものなのでしょうか? ... |PCL のインストールの仕方が間違っているに違いない |こんな例で比べるのは意味がない |こんなものだ | |等々どんなことでも結構ですからご意見お待ちしています。 まず結論から言うと,こんなものだと思います. このプログラムは PCL 処理系のいろんな負荷を合わせて計ってい るだけのように見えます.そもそも,オブジェクト指向にする意味 のないところで defclass/defmethod しても,PCL が遅いのは当り 前です. この場合,slot-value の代わりにアクセサ(この場合ならリーダ でもOK)を定義して使ってみると2〜3倍速くなると思います. でも,make-instance はどうしようもないですね.slot-value や make-instance は defstruct のアクセサやコンストラクタよりも 遅いです. 同じフィボナッチ数列で,少し違う例を試してみました.これは, defmethod による総称関数と通常の関数との比較です. (環境は KCl/SUN3 + Victoria Day PCL で,KCl 用 turbo-closure パッチはあてていません.time は引数 10 でインタプリタベー スで計っています.) ---- 通常の関数(関数内で型チェックする)-------------------- (defun fibo3 (x) (cond ((not (integerp x)) (error "‾S is not an integer." x)) ((minusp x) (error "‾S is minus." x)) ((= 0 x) 1) ((= 1 x) 1) (t (+ (fibo3 (- x 1)) (fibo3 (- x 2)))))) ------------------------------------------------------------- real time : 0.183 secs run time : 0.167 secs ---- 総称関数の機能により型チェックする --------------------- (defmethod fibo4 ((x integer)) (cond ((minusp x) (error "‾S is minus." x)) ((= 0 x) 1) ((= 1 x) 1) (t (+ (fibo4 (- x 1)) (fibo4 (- x 2)))))) ------------------------------------------------------------- real time : 0.433 secs run time : 0.367 secs ---- さらに総称関数による分岐 ------------------------------- (defmethod fibo5 ((x integer)) (cond ((minusp x) (error "‾S is minus." x)) (t (+ (fibo5 (- x 1)) (fibo5 (- x 2)))))) (defmethod fibo5 ((x (eql 0))) 1) (defmethod fibo5 ((x (eql 1))) 1) ------------------------------------------------------------- real time : 0.367 secs run time : 0.300 secs ------------------------------------------------------------- この例では,fibo3 の中に型チェックを入れて,defmethod が自動 的にやってくれるはずの処理を陽に書いてあります. また,eql specializer を使ったディスパッチの時間も計ってみま した. eql specializer を使うと遅くなりますが,それでもインタプリタ に cond の分岐をやらせるより速くなっていることが分かります. フィボナッチ数列程度では PCL を使った方が速くはならないです が,PCL 開発者である Kiczales Gregor によると,typecase で処 理するより,PCL の defmethod を利用した方が速いとのことです. ---------------- 日本電気(株) C&C共通ソフトウェア開発本部 環境システム開発部 吉川昌澄 yosikawa@ccs.mt.nec.co.jp