Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-03-07

読み書きの速度 (3)

| 18:08 | 読み書きの速度 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - 読み書きの速度 (3) - わだばLisperになる

SBCLでSYMBOL-VALUEでの書き込みが異様に遅い原因

SBCLだと (SETF SYMBOL-VALUE)がどういうわけか異様に遅いということが分かったのですが、Twitterでぶつぶつ言っていたらdisassembleすると良いよ!と言われたので、なるほどと思い、とりあえず定義を追い掛けてみました。

SBCLの場合、(SETF SYMBOL-VALUE)は、SETへ展開されるようで、そのSETは、SB-IMPL::%SET-SYMBOL-VALUEとSB-IMPL::ABOUT-TO-MODIFY-SYMBOL-VALUEを呼ぶようです。

SB-IMPL::%SET-SYMBOL-VALUEが本体のようなので、とりあえずこれを前回と同じように一億回呼んで測定してみます。

  0.125 sec. %SET-SYMBOL-VALUE-1-WRITE
 78.712 sec. SYMBOL-VALUE-1-WRITE

なるほど、%SET-SYMBOL-VALUEだと圧倒的に速いようです。

ということは、ABOUT-TO-MODIFY-SYMBOL-VALUEが遅いのかということで、これだけで計測してみましたが予想通りこの関数が原因でした。

この関数はどんな関数なのかと眺めてみると、コメントに

;;; This function is to be called just before a change which would affect the
;;; symbol value. We don't absolutely have to call this function before such
;;; changes, since such changes to constants are given as undefined behavior,
;;; it's nice to do so. To circumvent this you need code like this:
;;;
;;;   (defvar foo)
;;;   (defun set-foo (x) (setq foo x))
;;;   (defconstant foo 42)
;;;   (set-foo 13)
;;;   foo => 13, (constantp 'foo) => t
;;;
;;; ...in which case you frankly deserve to lose.
(defun about-to-modify-symbol-value (symbol action &optional (new-value nil valuep) bind)

のようなことが書いてあります。コメントにあるコード例が、こんなことしても良かったのか、というような例ですがSBCLでは可能なようです。(他の処理系ではエラー;未定義動作らしいですが…)

面白い色機能ですが速度低下の原因になったりするとしたら微妙な気もします…。