make-sequenceとmake-array

sbcl-1.0.34での話。


make-sequence関数はmake-array関数よりも特殊化されているので、より高速なのかと思っていたら、そうではなかった。

;; make-array関数
> (time
   (loop repeat 1000000 sum
     (length (make-array 1000 :initial-element 0))))
Evaluation took:
  0.019 seconds of real time
  0.020002 seconds of total run time (0.016001 user, 0.004001 system)
  [ Run times consist of 0.004 seconds GC time, and 0.017 seconds non-GC time. ]
  105.26% CPU
  60,569,996 processor cycles
  11,117,960 bytes consed
--> 1000000000

;; make-sequence関数
> (time
   (loop repeat 1000000 sum
     (length (make-sequence 'vector 1000 :initial-element 0))))
Evaluation took:
  6.166 seconds of real time       ; 6.166 / 0.019 = 324.5263
  6.164385 seconds of total run time (6.128383 user, 0.036002 system)
  [ Run times consist of 0.616 seconds GC time, and 5.549 seconds non-GC time. ]
  99.97% CPU
  19,560,403,822 processor cycles  ; 19,560,403,822 / 60,569,996 = 322.93884
  4,025,853,520 bytes consed       ; 4,025,853,520  / 11,117,960 = 362.1036
--> 1000000000

> (type-of (make-array 1000 :initial-element 0))
--> (SIMPLE-VECTOR 1000)

> (type-of (make-sequence 'vector 1000 :initial-element 0))
--> (SIMPLE-VECTOR 1000)

処理時間、コンス量ともにmake-sequence関数はmake-array関数の300倍以上のコストが掛っている。
理由は分からないが、sbclではmake-sequence関数は使わない方が良さそう。

追記(2010/04/10)

上で書いた内容は結構間違っていました。
yuki_neko_nyanさんがRe:make-sequenceとmake-arrayで適切に訂正(?)してくれているので、そちらを参照することを推奨します。