Path: titcca!etlcom!creamy!icspub!ognews1!nakatani From: nakatani@ognews1.osakagas.co.jp (Kosuke NAKATANI) Newsgroups: fj.lang.lisp Subject: Re: CLOS performance. (In Japanese/Kanji) Summary: Some experiments on CLOS performance. Message-ID: <190@ognews1.osakagas.co.jp> Date: 7 Mar 90 09:35:13 GMT References: <187@ognews1.osakagas.co.jp> Distribution: fj Organization: Osaka Gas Co., LTD. Lines: 96 中谷@大阪ガス・基盤研究所です。 In article , yosikawa@ccs.mt.nec.junet (Masazumi Yoshikawa) writes: > この場合,slot-value の代わりにアクセサ(この場合ならリーダ > でもOK)を定義して使ってみると2〜3倍速くなると思います. > でも,make-instance はどうしようもないですね.slot-value や > make-instance は defstruct のアクセサやコンストラクタよりも > 遅いです. ということなので、いろいろと試してみたら面白い結果が得られました。 [1]-- 前回ポストしたプログラム ------------------------- (defclass num2 () ((value :initarg :value))) (defmethod fibo4 ((x num2)) (cond ((= 0 (slot-value x 'value)) 1) ((= 1 (slot-value x 'value)) 1) (t (+ (fibo4 (make-instance 'num2 :value (- (slot-value x 'value) 1))) (fibo4 (make-instance 'num2 :value (- (slot-value x 'value) 2))))))) PCL>(time (fibo4 (make-instance 'num2 :value 10))) real time : 8.567 secs run time : 8.417 secs [2]-- slot-value の代わりに reader を使った例 ----------- (defclass num2 () ((value :initarg :value :reader num2-value))) (defmethod fibo5 ((x num2)) (cond ((= 0 (num2-value x)) 1) ((= 1 (num2-value x)) 1) (t (+ (fibo5 (make-instance 'num2 :value (- (num2-value x) 1))) (fibo5 (make-instance 'num2 :value (- (num2-value x) 2))))))) PCL>(time (fibo5 (make-instance 'num2 :value 10))) real time : 3.283 secs run time : 3.233 secs ということで、2倍以上速くなりました。 [3]-- defconstructor を使った例 --------------------------- これについては、富士ゼロックスの木内さんより教えていただきました どうもありがとうございました。 (defclass num2 () ((value :initarg :value :reader num2-value))) (defconstructor make-num2 num2 (value) :value value) (defmethod fibo6 ((x num2)) (cond ((= 0 (num2-value x)) 1) ((= 1 (num2-value x)) 1) (t (+ (fibo6 (make-num2 (- (num2-value x) 1))) (fibo6 (make-num2 (- (num2-value x) 2))))))) PCL>(time (fibo6 (make-num2 10))) real time : 4.633 secs run time : 4.500 secs と、マクロ展開が必要な分だけ fibo5 より遅くなってしまいます。 次に compile-file で以上をコンパイルしてみました [1']-- 実験1をコンパイルしたもの ------------------- PCL>(time (fibo4 (make-instance 'num2 :value 10))) real time : 3.067 secs run time : 3.033 secs [2']-- 実験2をコンパイルしたもの ------------------- PCL>(time (fibo5 (make-instance 'num2 :value 10))) real time : 2.233 secs run time : 2.233 secs [1'],[2']共、コンパイルしない時と比べて2倍強程度速くなっています。 [3']-- 実験3をコンパイルしたもの ----------------- PCL>(time (fibo6 (make-num2 10))) real time : 0.183 secs run time : 0.167 secs この場合は25倍程度も速くなりました。 ということで、defconstrutor を使い、かつコンパイルすれば、かなりの速度向上 が見られることがわかりました。  中谷浩介@大阪ガス・基盤研究所 nakatani@osakagas.co.jp