什么使基于堆的Scheme比基于堆栈的Scheme慢?

时间:2012-01-18 18:02:00

标签: compiler-construction scheme compiler-optimization

我正在为类似于Scheme的语言开发编译器,并正在阅读Dybvig的论文。在其中,他说通过在堆栈上而不是在堆上分配调用帧来实现大部分性能提升。为了在闭包和延续的情况下实际完成这项工作,需要做几个技巧。

我的问题是这种性能增益来自何处?这纯粹是因为我们减少了对垃圾收集器的压力吗?

换句话说:假设我们有无限的内存,堆叠分配的调用帧是否仍然比堆分配的调用帧快?

2 个答案:

答案 0 :(得分:4)

我认为Eli回答了你的问题,所以我打算将他的评论粘贴在这里并获得赞誉:)。

Eli Barzilay写道:

(a)处理堆需要更多时间,因为它需要扫描它(它不像堆栈那样是线性的); (b)几乎所有的cpu架构都特别强调尽可能快地进行堆栈访问,而不是堆栈。

对此我会添加关于缓存局部性的一般挥手。也就是说,堆栈将所有操作保存在内存的一小部分中,这几乎肯定会保留在缓存中。

答案 1 :(得分:0)

Appel写了一篇paper声称堆分配比堆栈分配更快。在数学上他是正确的,但他忽略了现代处理器如何定制运行使用堆栈的代码(缓存局部性,高效堆栈指令等)以及堆访问有更多的间接性(现代CPU中的不良)。

相关问题