Path: titcca!fgw!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: 6 Mar 90 08:31:47 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: 139 In-reply-to: yosikawa@ccs.mt.nec.junet's message of 5 Mar 90 12:19:07 GMT In article yosikawa@ccs.mt.nec.junet (Masazumi Yoshikawa) writes: |フィボナッチ数列程度では PCL を使った方が速くはならないです |が,PCL 開発者である Kiczales Gregor によると,typecase で処 |理するより,PCL の defmethod を利用した方が速いとのことです. またまた,吉川@NECです. PCL の defmethod による引数のディスパッチと KCl の typecase によるディスパッチの性能を,もう少しちゃんと調べてみました. また,2引数のマルチメソッドについても調べてみました. 長くなりそうなので,まず,結果から. PCL>(time (test-kcl-1)) ; KCl の typecase による1引数のディスパッチ real time : 1.367 secs run time : 0.900 secs PCL>(time (test-pcl-1)) ; PCL の defmethod による1引数のディスパッチ real time : 0.950 secs run time : 0.583 secs PCL>(time (test-kcl-2)) ; KCl の typecase による2引数のディスパッチ real time : 9.400 secs run time : 3.583 secs PCL>(time (test-pcl-2)) ; PCL のマルチメソッドによる2引数のディスパッチ real time : 7.250 secs run time : 1.717 secs これを見ると, ・typecase でディスパッチするより PCL の総称関数の方が速い ・マルチメソッドの場合,PCL の有効性がより顕著になる ということが分かります. (このテストを行なった環境は, SUN3/260(32M Memory) + KCl(May 15, 1989) + Victoria Day's PCL(May, 89) で,すべてコンパイルドコードによる数値です.) 以下,テストプログラムとコメントなどを... ;;;; 準備 (defstruct s1) (defstruct s2) (defclass c1) (defclass c2) ;;;; KCl の typecase による1引数のディスパッチ (defun kcl-dispatch-1 (x) (typecase x (s1 's1) (s2 's2))) (defun test-kcl-1 () (let ((s1 (make-s1)) (s2 (make-s2))) (dotimes (i 1000) (kcl-dispatch-1 s1)) (dotimes (i 1000) (kcl-dispatch-1 s2)))) ;;;; PCl の defmethod による1引数のディスパッチ (defmethod pcl-dispatch-1 ((x c1)) 'c1) (defmethod pcl-dispatch-1 ((x c2)) 'c2) (defun test-pcl-1 () (let ((c1 (make-instance 'c1)) (c2 (make-instance 'c2))) (dotimes (i 1000) (pcl-dispatch-1 c1)) (dotimes (i 1000) (pcl-dispatch-1 c2)))) ;;;; KCl の typecase を2重に使った2引数のディスパッチ (defun kcl-dispatch-2 (x y) (typecase x (s1 (typecase y (s1 's1-s1) (s2 's1-s2))) (s2 (typecase y (s1 's2-s1) (s2 's2-s2))))) (defun test-kcl-2 () (let ((s1 (make-s1)) (s2 (make-s2))) (dotimes (i 1000) (kcl-dispatch-2 s1 s1)) (dotimes (i 1000) (kcl-dispatch-2 s1 s2)) (dotimes (i 1000) (kcl-dispatch-2 s2 s1)) (dotimes (i 1000) (kcl-dispatch-2 s2 s2)))) ;;;; PCl のマルチメソッドによる2引数のディスパッチ (defmethod pcl-dispatch-2 ((x c1) (y c1)) 'c1-c1) (defmethod pcl-dispatch-2 ((x c1) (y c2)) 'c1-c2) (defmethod pcl-dispatch-2 ((x c2) (y c1)) 'c2-c1) (defmethod pcl-dispatch-2 ((x c2) (y c2)) 'c2-c2) (defun test-pcl-2 () (let ((c1 (make-instance 'c1)) (c2 (make-instance 'c2))) (dotimes (i 1000) (pcl-dispatch-2 c1 c1)) (dotimes (i 1000) (pcl-dispatch-2 c1 c2)) (dotimes (i 1000) (pcl-dispatch-2 c2 c1)) (dotimes (i 1000) (pcl-dispatch-2 c2 c2)))) ;;;; 以上 KCl では PCl と対等になるように defstruct を用いていますが, integer などの built-in class でディスパッチした場合, typecase の方が速くなるだろうと思います. これは,PCL が built-in class のクラスを調べるより,integerp などの型判定の方が速いからです. ただし,これは PCL が Common Lisp で書かれているためであって, 必ずしも一般的な CLOS 処理系の性能ということではありません. built-in クラスでもマルチメソッドなら PCL の方が勝つかな? 最新の Rainy Day's PCL は,まだ make に成功していないので 残念ながらテストできませんでした.:-( このバージョンは,かなり性能が向上されているはずなので,計っ てみたいですね. どなたか,最新の KCl で Rainy Day's の make に成功した人いま せんか? コンパイルドコードで比較したのは,PCL の総称関数がコンパイ ルドクロージャで作られているからです.typecase をインタプリ ットさせると,ちょっとハンディが多き過ぎるでしょう. PCL は“遅い CLOS 処理系”だと思っていたのですが,それでも typecase よりは十分速いんですね. ---------------- 日本電気(株) C&C共通ソフトウェア開発本部 環境システム開発部 吉川昌澄 yosikawa@ccs.mt.nec.co.jp TEL:(03)5476-1105, FAX:(03)5476-1113