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-25

KMRCLを眺める (72) NULL-OUTPUT-STREAM

| 01:10 | KMRCLを眺める (72) NULL-OUTPUT-STREAM - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (72) NULL-OUTPUT-STREAM - わだばLisperになる

今回はKMRCLのio.lisp中からNULL-OUTPUT-STREAMです。

前回、

(LET ((NULL-STREAM (MAKE-INSTANCE 'SB-SIMPLE-STREAMS:NULL-SIMPLE-STREAM)))
  (LOOP :REPEAT 1000000
        :DO (WRITE-FIXNUM (RANDOM MOST-POSITIVE-FIXNUM)
                          NULL-STREAM)))

のようなテストで、出力を捨てるために、NULL-STREAMを作成していましたが、今回のNULL-OUTPUT-STREAMはそのNULL-STREAMを作成するものです。

定義は、

(defun null-output-stream ()
  (when (probe-file #p"/dev/null")
    (open #p"/dev/null" :direction :output :if-exists :overwrite)))

となっていて、UNIXの/dev/nullを利用しています。

NULLストリームの作成方法については、逆引きCommon Lispにもあるのですが、

逆引きCL:NULLストリームを使う

(MAKE-TWO-WAY-STREAM (MAKE-CONCATENATED-STREAM) 
                     (MAKE-BROADCAST-STREAM))

というコードで 読み出すとEOF & 書き込みは捨てられる ストリームが作成できます。

また、処理系にも非依存です。

/dev/nullを利用する方法がわざわざ使われているからには、そっちの方が性能が良かったりするのかもしれない、ということで速度を測定してみました。

  • NULL-OUTPUT-STREAM
Test with 10 iterations: ((LET ((NULL-STREAM (NULL-OUTPUT-STREAM)))
                            (LOOP :REPEAT 1000000
                                  :DO (WRITE-FIXNUM
                                       (RANDOM MOST-POSITIVE-FIXNUM)
                                       NULL-STREAM))))
Total time: 28.73 sec, time per iteration: 2.87 sec
  • (MAKE-TWO-WAY-STREAM (MAKE-CONCATENATED-STREAM) (MAKE-BROADCAST-STREAM))
Test with 10 iterations: ((LET ((NULL-STREAM
                                 (MAKE-TWO-WAY-STREAM
                                  (MAKE-CONCATENATED-STREAM)
                                  (MAKE-BROADCAST-STREAM))))
                            (LOOP :REPEAT 1000000
                                  :DO (WRITE-FIXNUM
                                       (RANDOM MOST-POSITIVE-FIXNUM)
                                       NULL-STREAM))))
Total time: 24.60 sec, time per iteration: 2.46 sec

大体同じか、/dev/nullを利用しない方がちょっと速いようです。

これだったら(MAKE-TWO-WAY-STREAM (MAKE-CONCATENATED-STREAM) (MAKE-BROADCAST-STREAM))の方を使っておいた方が良い気がします。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100125