Path: titcca!ccut!kyu-cs!champon!umerin From: umerin@tc.Nagasaki.GO.JP (Masanobu UMEDA) Newsgroups: fj.lang.lisp Subject: Re: CLOS performance. (In Japanese/Kanji) Message-ID: Date: 19 Mar 90 10:04:35 GMT References: <187@ognews1.osakagas.co.jp> Sender: news@tc.nagasaki.go.jp Reply-To: umerin@tc.Nagasaki.GO.JP Distribution: fj Organization: Technology Center, Nagasaki, Japan. Lines: 45 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: この場合,slot-value の代わりにアクセサ(この場合ならリーダ でもOK)を定義して使ってみると2〜3倍速くなると思います. 私は、MacIvory (Ivory II) 上で Victoria Day PCL を使用しています。 さて、slot-value よりアクセッサの方が速いとのことですが、それはどうし てなのでしょうか? 私が理解している範囲では、slot-value は、メソッドの中では、かなり低レ ベルの関数に展開されているので、一般的にはアクセッサを使うよりも速くな ると思われるのですが。特に、同じメソッドの中で、 slot-value を複数回実 行すると、この違いが明らかになると思います。 なぜならば、スロットの値を得る為に必要な”情報”を、メッソッドの最初で 一回だけ得れば良いからです。 次の関数は、vector.lisp から抜き出して来たものです。これは、メッソドの 内部で最終的に実行される slot-value の実体です。ここで、変数 .pv. はス ペシャル変数となっていますが、これがその”情報”を覚えておく場所です。 一方、アクセッサでは、このような最適化を行なうことが、困難だからです。 私は、以上のように理解しているのですが、実の所あまり自信はありません。 間違って理解しているようでしたら、御指摘下さい。 ---------------------------------------------------------------------- (defun std-instance-access-pv-internal (slots-fetcher instance pv-offset nvp new-value) (if nvp (once-only (new-value) `(let ((.index. (memory-block-ref .pv. ,pv-offset))) (if (null .index.) (pv-access-trap ,instance ,pv-offset .isl. ,new-value) (setf (%svref (,slots-fetcher ,instance) .index.) ,new-value)))) `(let ((.temp. (memory-block-ref .pv. ,pv-offset))) (if (or (null .temp.) (eq (setq .temp. (%svref (,slots-fetcher ,instance) .temp.)) ',*slot-unbound*)) (pv-access-trap ,instance ,pv-offset .isl.) .temp.)))) -- Masanobu UMEDA umerin@tc.Nagasaki.GO.JP