10

众所周知的常识是,对于大多数算法来说,在堆栈上分配和释放数据比在堆上分配和释放数据要快得多。在 C++ 中,代码的区别就像

double foo[n*n]

对比

double* foo = new int[n*n]

但是,在访问和计算位于堆或堆栈上的数据时,有什么显着差异吗?即是否存在速度差异

foo[i]

代码应该在几种不同的架构上运行,因此尝试和测量将不起作用。

4

4 回答 4

4

可能存在(高度依赖于系统的)关于缓存位置和读/写未命中的问题。如果您在堆栈堆数据上运行程序,那么可以想象(取决于您的缓存体系结构)您会遇到更多的缓存未命中,而不是完全在堆栈的一个连续区域上运行它。这是 Andrew Appel(来自 SML/NJ)和 Zhong Shao 对这个问题的论文,他们正是在其中研究了这个问题,因为堆栈/堆分配是函数式语言实现的一个主题:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.3778

他们发现了一些写入未命中的性能问题,但估计这些问题将通过缓存的进步来解决。

所以我对当代桌面/服务器机器的猜测是,除非你运行高度优化的、特定于架构的代码,这些代码沿着缓存线流式传输数据,否则你不会注意到堆栈和堆访问之间的任何区别。对于具有小缓存的设备(如 ARM/MIPS 控制器),情况可能会有所不同,忽略缓存无论如何都会产生明显的性能影响。

于 2010-08-11T07:48:06.357 回答
1

作为单一陈述,没关系。
没有更多的上下文,几乎不能说。有一些有利于堆栈的影响,实际上在所有时间都可以忽略不计。

  • 堆栈可能已经在缓存中,新分配的堆块可能不是。然而,这只是第一次执行惩罚。对于大量数据,无论如何您都会破坏缓存

  • 栈分配本身比堆分配便宜一点,因为分配更简单

  • 从长远来看,堆的主要问题通常是碎片,这是一种“累积成本”,(通常)不能归因于单个分配,但可能会显着增加进一步分配的成本

至少测量这些影响是很棘手的。

建议:性能不是这里的决定因素。可移植性和可扩展性建议将堆用于除极少量数据之外的所有数据。

于 2010-08-11T07:59:12.873 回答
1

堆栈将更频繁地位于CPU 缓存中,因此在某些(大多数?)情况下可能会更快。

但最准确的答案可能是:这取决于...

于 2010-08-11T07:08:42.087 回答
-1

除了分配之外,无论是基于堆栈还是基于堆的数据访问之间都应该没有明显的区别—​​—归根结底,它都是内存。

于 2010-08-11T06:59:18.343 回答