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 |

2010-01-24

KMRCLを眺める (71) WRITE-FIXNUM

| 02:43 | KMRCLを眺める (71) WRITE-FIXNUM - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (71) WRITE-FIXNUM - わだばLisperになる

今回はKMRCLのio.lisp中からWRITE-FIXNUMです。

動作は、その名の通り

(WITH-OUTPUT-TO-STRING (OUT)
  (WRITE-FIXNUM 8 OUT))
⇒ "8"

となっています。

定義は、

(declaim (inline write-fixnum))
(defun write-fixnum (n s)
  #+allegro (excl::print-fixnum s 10 n)
  #-allegro (write-string (write-to-string n) s))

となっていますが、Allegro CLだとFIXNUM専用の関数があって速くなるような様子ぶり。

本当なんだろうかということで実験してみました。

;; 百万回FIXNUMを出力
(LET ((NULL-STREAM (MAKE-INSTANCE 'STREAM::NULL-STREAM)))
  (LOOP :REPEAT 1000000 
        :DO (WRITE-FIXNUM (RANDOM MOST-POSITIVE-FIXNUM)
                          NULL-STREAM)))
;⇒ NIL
----------
; cpu time (non-gc) 5,350 msec user, 20 msec system
; cpu time (gc)     1,340 msec user, 150 msec system
; cpu time (total)  6,690 msec user, 170 msec system
; real time  6,974 msec
; space allocation:
;  17,002,102 cons cells, 29,232 other bytes, 18,128 static bytes
(declaim (inline write-fixnum-slow))
(defun write-fixnum-slow (n s)
  (write-string (write-to-string n) s))
;; 百万回FIXNUMを出力
(LET ((NULL-STREAM (MAKE-INSTANCE 'STREAM::NULL-STREAM)))
  (LOOP :REPEAT 1000000
        :DO (WRITE-FIXNUM-SLOW (RANDOM MOST-POSITIVE-FIXNUM)
                               NULL-STREAM)))
;⇒ NIL
----------
; cpu time (non-gc) 12,380 msec user, 50 msec system
; cpu time (gc)     230 msec user, 0 msec system
; cpu time (total)  12,610 msec user, 50 msec system
; real time  12,673 msec
; space allocation:
;  20,000,245 cons cells, 79,996,576 other bytes, 54,864 static bytes

確かに手元では、倍くらい速いようです。

しかし、こんなに大量にFIXNUMを高速にWRITEしたいことってあるんだろうか…。