Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 什么使基于堆的方案比基于堆栈的方案慢?_Compiler Construction_Scheme_Compiler Optimization - Fatal编程技术网

Compiler construction 什么使基于堆的方案比基于堆栈的方案慢?

Compiler construction 什么使基于堆的方案比基于堆栈的方案慢?,compiler-construction,scheme,compiler-optimization,Compiler Construction,Scheme,Compiler Optimization,我正在为一种类似Scheme的语言开发一个编译器,并且正在阅读Dybvig的论文。他在书中说,通过在堆栈上而不是堆上分配调用帧,他获得了大部分性能提升。为了在存在闭包和延续的情况下真正做到这一点,需要做一些技巧 我的问题是,这种性能提升来自哪里?这纯粹是因为我们减少了垃圾收集器的负担吗 换句话说:假设我们有无限大的内存,堆栈分配的调用帧会比堆分配的调用帧更快吗?我想Eli回答了你的问题,所以我将把他的评论粘贴在这里,并获得好评:) Eli Barzilay写道: (a) 处理堆需要更多的时间,因

我正在为一种类似Scheme的语言开发一个编译器,并且正在阅读Dybvig的论文。他在书中说,通过在堆栈上而不是堆上分配调用帧,他获得了大部分性能提升。为了在存在闭包和延续的情况下真正做到这一点,需要做一些技巧

我的问题是,这种性能提升来自哪里?这纯粹是因为我们减少了垃圾收集器的负担吗


换句话说:假设我们有无限大的内存,堆栈分配的调用帧会比堆分配的调用帧更快吗?

我想Eli回答了你的问题,所以我将把他的评论粘贴在这里,并获得好评:)

Eli Barzilay写道:

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


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

Appel写了一篇文章,声称堆分配可以比堆栈分配更快。从数学上讲,他是正确的,但他忽略了现代处理器如何适应使用堆栈(缓存位置、有效堆栈指令等)的代码运行,以及堆访问具有更多的间接性(在现代CPU中很糟糕)。

您提到的“垃圾收集器”-你的实现语言是什么?我的实现语言是C。但我应该澄清一下,我的意思是编译代码的性能提高,而不是编译器本身的性能提高。请注意,答案是:(a)处理堆需要更多的时间,因为它需要扫描堆(不像堆栈那样是线性的);(b) 实际上,所有的cpu体系结构都特别强调尽可能快地访问堆栈,而堆则不是。我对体系结构不太了解,所以(b)对我来说很有趣。至于(a),我使用的是停止复制垃圾收集器,因此堆上的分配和堆栈上的分配一样便宜。我问这个问题的原因是,Dybvig的解决方案似乎涉及到很多开销,而且到目前为止,我所看到的唯一优势(除了CPU支持)是以后要清理的调用帧更少。我还想补充一点,与收集堆相比,堆栈上的垃圾收集非常便宜(弹出帧)。