gpt4 book ai didi

lisp - 为什么 Lisp 中的 consing 很慢?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:24 27 4
gpt4 key购买 nike

我在“On Lisp”一书中读到,应该避免在扩展宏的主体中过度使用 cons。为什么 cons 被认为是低效操作? Lisp 不与 cons 单元共享结构吗?

最佳答案

您需要先了解行话。

CONS 是创建新 cons 单元的原始操作。

Consing 是指一般在堆上分配内存,而不仅仅是cons cells: Consing of numbers, Consing of arrays, Consing of CLOS objects, ...

“内存管理词汇表”中的定义说:

  1. cons(1) 在 Lisp 中,cons 是一个创建列表元素的原始操作(来自英文“CONStruct”)。通过扩展,缺点是创建的元素。
  2. 缺点(2)(有关详细信息,请参阅分配)分配是过程分配资源。什么时候程序要求,一个应用程序内存管理器或分配器分配一个 block memory(2) 供程序存放它的数据在。分配也是称为 coning,来自 cons(1)。

因此,Graham 使用了第二种含义。

如果格雷厄姆说“尤其要避免 consing”。不必要地使用的实用程序会破坏原本高效的程序的性能。 - 这意味着:避免在堆上分配不必要的内存。但这适用于任何代码 - 宏、函数等等。

当计算机内存较少且垃圾收集成本更高时(尤其是当它需要扫描虚拟内存系统中的换出内存时,物理内存小于虚拟内存时)尤其如此。

如今 consing 不再是一个问题,但仍然具有相关性。

以函数 READ-LINE 为例,它从流中读取一行并“conses”一个新字符串。请注意,字符串不是由 conses 构建的,而是一个向量。我们这里的意思是“在堆上分配一个字符串”。如果你有一个包含很多行的大文件,那么拥有一个获取缓冲区并用行字符填充缓冲区的例程会更快(Common Lisp 中有向量和填充指针)。这样,行缓冲区就只是一个对象,并且有可能被重新用于调用此行读取函数。

请参阅 Allegro CL 文档中的此示例:Some techniques for reducing consing when processing very large text files .

关于lisp - 为什么 Lisp 中的 consing 很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com