@sds の回答のいくつかのヒントを使用して、特定の実装に関する私の質問に答える可能性のある簡単な予備テストがあることに気付きました (dissemble
出力を処理する必要はありません)。SBCL と CCL は、の戻り値が無視される場合mapcar
と同じように処理するとは限らないようです。最初に と を有意な長さのリストとして定義し(私のものは長さが 100,000 で、整数が含まれていました)、次に、次のようにそれらに対して 、 などを何度も実行します (古いガベージをクリアするためのオプションの予備呼び出しを使用)。mapc
mapcar
lis1
lis2
mapcar
mapc
gc
(gc :full t)
(time
(progn
(dotimes (ignored 1000)
(mapcar #'+ lis1 lis2))
(format t "mapcar:~%")))
(gc :full t)
(time
(progn
(dotimes (ignored 1000)
(mapc #'+ lis1 lis2))
(format t "mapc:~%")))
(gc :full t)
(time
(progn
(dotimes (ignored 1000)
(map nil #'+ (the list lis1) (the list lis2)))
(format t "map nil with lists~%")))
たとえば、私のマシンで SBCL を実行すると、次のようになります。
mapcar:
Evaluation took:
2.306 seconds of real time
2.287627 seconds of total run time (2.136130 user, 0.151497 system)
[ Run times consist of 0.147 seconds GC time, and 2.141 seconds non-GC time. ]
99.22% CPU
3,683,188,504 processor cycles
1,600,049,536 bytes consed
mapc:
Evaluation took:
0.639 seconds of real time
0.638733 seconds of total run time (0.638011 user, 0.000722 system)
100.00% CPU
1,020,310,296 processor cycles
0 bytes consed
map nil with lists
Evaluation took:
0.592 seconds of real time
0.592114 seconds of total run time (0.591199 user, 0.000915 system)
100.00% CPU
945,957,944 processor cycles
0 bytes consed
これらは、デフォルトの最適化設定での典型的な結果です。速度、非安全性などを最適化するためにを使用declaim
すると、少し速度が上がりますが、とmapc
がmap nil
よりも桁違いに速いという事実は変わりません。CCL の結果も同様ですが、全体的に遅くなります。mapcar
mapcar