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で適切に訂正(?)してくれているので、そちらを参照することを推奨します。