堆和栈数据访问性能对比

2024-04-29

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

double foo[n*n]

vs.

double* foo = new int[n*n]

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

foo[i]

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


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆和栈数据访问性能对比 的相关文章

随机推荐