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: 28 Mar 90 03:02:46 GMT References: 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: umerin@tc.Nagasaki.GO.JP's message of 23 Mar 90 02:03:30 GMT こんにちは,NECの吉川です. slot-value とアクセサとどっちが速いかということですが, ・まず,実験をしてみましたのでその結果(KCl/Victoria Day PCL on SUN3)から. *結論: slot-value より accessor の方が速い. *実験内容: 以下のファイルをコンパイルして,速度を比較した. (defclass c () ((s :accessor accessor :initarg :s))) (defun test-slot-value () (let ((instance (make-instance 'c :s 1))) (dotimes (i 1000) (slot-value instance 's)))) (defun test-accessor () (let ((instance (make-instance 'c :s 1))) (dotimes (i 1000) (accessor instance)))) *データ: (time (test-slot-value)) (time (test-accessor)) run time : 0.533 secs run time : 0.283 secs run time : 0.317 secs run time : 0.217 secs run time : 0.317 secs run time : 0.283 secs run time : 0.350 secs run time : 0.233 secs run time : 0.350 secs run time : 0.217 secs run time : 0.283 secs run time : 0.217 secs ・さて,次にその理由ですが... 私は PCL のコードに詳しくないので嘘をいうかも知れません. その点はご指摘下さい. In article umerin@tc.Nagasaki.GO.JP (Masanobu UMEDA) writes: |In article yosikawa@ccs.mt.nec.junet (Masazumi Yoshikawa) writes: | 一方,アクセサはメソッドとして定義されるというデメリットもあ | りますが, | (slot-value-using-class (class-of object) object slot-name) | の (class-of object) と slot-name が分かっている分速いと考え | られます.slot-value-using-class を呼ぶ必要はない訳です. | | (もっとも,slot-value も slot-name が 'xxx の形で渡されてい | る部分だったら同様に最適化が可能だとは思いますが.) | |そうです。実際に、PCL ではこれを行なっているようです。ただし、 | |(defmethod OPTIMIZE-SLOT-VALUE ((class standard-class) form) | (destructuring-bind (ignore instance slot-name) | form | `(standard-instance-access ,instance | ',(reduce-constant slot-name)))) OPTIMIZE-SLOT-VALUE に trace を掛けて上のテストプログラムを load/compile してみたのですが,どうも呼ばれてはいないようで す. これは,おそらく,関数 test-slot-value の中の変数 instance がクラス c のインスタンスであるという事実を KCl のコンパイラ または,PCL が知らないためでしょう. 一方,defmethod の中で slot-value を使ってみたら, PCL>(defmethod svalue ((i c)) (slot-value i 's)) 1> (OPTIMIZE-SLOT-VALUE # (SLOT-VALUE I 'S)) <1 (OPTIMIZE-SLOT-VALUE (STANDARD-INSTANCE-ACCESS I 'S)) NIL となりました. こうなると,OPTIMIZE-SLOT-VALUE の有効性が出てくる訳ですが, このメソッド svalue というのは,アクセサ accessor と意味的に まったく同様のメソッドです. つまり,OPTIMIZE-SLOT-VALUE というのは slot-value の利用をア クセサに *近付ける* ための最適化をしているだけであって,最適 化した結果,アクセサ以上に速くなるということはないだろうと思 います. じゃあ,アクセサはどうなっているかというと,おそらく常に (STANDARD-INSTANCE-ACCESS I 'S) に対応する機能を利用している のではないでしょうか? ---------------- 日本電気(株) C&C共通ソフトウェア開発本部 環境システム開発部 吉川昌澄 yosikawa@ccs.mt.nec.co.jp