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: 22 Mar 90 01:16:26 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: 51 In-reply-to: umerin@tc.Nagasaki.GO.JP's message of 19 Mar 90 10:04:35 GMT In article umerin@tc.Nagasaki.GO.JP (Masanobu UMEDA) writes: |さて、slot-value よりアクセッサの方が速いとのことですが、それはどうし |てなのでしょうか? 私も最適化など考えると確信が持てないのですが,理解している範 囲でお答えします. まず,単純に考えた場合, slot-value は, object と slot-name とを引数に取り,対応す るスロットの値を参照する関数です.これには object のクラスと slot-name とから,そのスロットのアクセス方法を入手するための 作業が必要です. これに対し,アクセサは,その定義時に既に object のクラスと slot-name が決まっています.従って,アクセス方法が既知である 分アクセサが速いということになります. CLOS の仕様の Chap.2 の slot-value を見ると, 「関数 slot-value は(総称関数)slot-value-using-class を用 いて実現されている.」 と書かれています.実際,PCL でも (defun slot-value (object slot-name) (slot-value-using-class (class-of object) object slot-name)) と定義されています.(slot-value-using-class は,メタクラス のメソッドとして定義されています.) 一方,アクセサはメソッドとして定義されるというデメリットもあ りますが, (slot-value-using-class (class-of object) object slot-name) の (class-of object) と slot-name が分かっている分速いと考え られます.slot-value-using-class を呼ぶ必要はない訳です. さて,最適化を考えた場合ですが,最適化は処理系にも依存するし, PCL でどうしているか良く把握していないので,何とも言えません. 詳しい方のフォローをお願いします. ただ,defclass で定義されるアクセサと処理系のプリミティブな スロットアクセサとの相違点は,アクセサが総称関数である点ぐら いのはずです.従って,引数となるオブジェクトのクラスさえ知っ ていれば,プリミティブアクセサに展開できるはずです. (もっとも,slot-value も slot-name が 'xxx の形で渡されてい る部分だったら同様に最適化が可能だとは思いますが.) ---------------- 日本電気(株) C&C共通ソフトウェア開発本部 環境システム開発部 吉川昌澄 yosikawa@ccs.mt.nec.co.jp