为什么在给数组赋值时要用到cons?
我遇到了一个问题:在sbcl中给大型数组设值时,会进行大量的内存分配(俗称consing),而我又需要频繁这样做,导致堆空间很快被占满。产生consing的原因是什么,是否有可避免的办法?
下面是我尝试的:
(defun test-array ()
(let ((arr1 (make-array
200000
:element-type 'single-float
:initial-element 1.0)))
(dotimes (x 200000) (setf (aref arr1 x) 0.0))))
(time (test-array))
结果是:
Evaluation took:
0.000 seconds of real time
0.000119 seconds of total run time (0.000112 user, 0.000007 system)
100.00% CPU
235,760 processor cycles
800,016 bytes consed
0.000140 seconds of total run time (0.000132 user, 0.000008 system)
声明数组元素的类型似乎帮助不大(单精度浮点数将consing从 1,600,000降至800,000)。性能分析并未显示额外信息。
解决方案
问题在于你对“consing”是什么意思的误解。它指的是任何动态内存分配,而不仅仅是cons cell。在这种情况下,你是在为数组本身分配内存。单精度浮点数组的每个元素占用4 字节,200,000 × 4 = 800,000字节。其余的16字节来自数组元数据的开销。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。