Pat*_* Li 7 compiler-construction scheme compiler-optimization
我正在为类似于Scheme的语言开发编译器,并正在阅读Dybvig的论文.在其中,他说通过在堆栈上而不是堆上分配调用帧来实现大部分性能提升.为了在闭包和延续的情况下实际完成这项工作,需要做几个技巧.
我的问题是这种性能增益来自何处?这纯粹是因为我们减少了对垃圾收集器的压力吗?
换句话说:假设我们有无限的内存量,堆叠分配的调用帧是否仍然比堆分配的调用帧快?
我认为 Eli 回答了你的问题,所以我将在这里粘贴他的评论并获得荣誉:)。
伊莱·巴齐莱写道:
(a) 处理堆需要更多时间,因为它需要扫描它(它不像堆栈那样是线性的);(b) 几乎所有 CPU 架构都特别强调尽可能快地进行堆栈访问,而堆则不然。
对此,我想添加有关缓存局部性的一般性说明。也就是说,堆栈将所有操作保存在内存的一小部分中,这几乎肯定会保留在缓存中。