【问题标题】:comparison of access performance of data in heap and stack堆和栈中数据的访问性能比较
【发布时间】:2011-03-28 05:25:42
【问题描述】:

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

double foo[n*n]

对比

double* foo = new int[n*n]

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

foo[i]

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

【问题讨论】:

  • 如果有帮助,here's 是一个简单的基准测试,它只读取和写入大数组的每个元素。在我的机器上,当数组在堆栈上时,它的运行速度至少快 5 倍。

标签: performance heap-memory stack-memory


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

        李>

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-07-26
          • 2018-08-04
          • 2012-06-25
          • 2020-04-20
          • 2014-11-24
          • 1970-01-01
          • 2015-01-09
          • 2014-05-27
          • 2021-10-13
          相关资源
          最近更新 更多