当在有限递归循环中操作大型数组时,我应该在哪一点从堆栈切换到堆?

When manipulating large arrays in a finite recursive loop, what point should I switch from stack to heap?

本文关键字:一点 堆栈 我应该 循环 递归 操作 大型 数组      更新时间:2023-10-16

非常 c++新手,我试图优化程序的速度,该程序在递归循环中对大型一维数组中的元素执行计算。实际上,一维数组存储的是3D矩阵的值,每个值都是一个浮点数。矩阵的尺寸可达1500 x 2000 x 200。

我已经读到堆栈内存的读取速度可能比堆内存快,但是是否存在一个大小限制,在这个限制下,它变得低效甚至不切实际,假设我将堆栈大小设置得足够大以容纳所有数据?

谢谢你的帮助,如果这是一个愚蠢的问题,我道歉!

PS如果你能建议任何其他技术,我应该看看,以加快我的程序,我将不胜感激!

堆栈内存和堆内存在速度上没有区别。优化代码的最佳方法是以线性方式遍历数组,以最大化缓存利用率。

假设我将堆栈大小设置得足够大以容纳所有数据,那么

是否存在一个大小限制,使其变得低效甚至不切实际?

。不过,您可能希望将递归循环更改为迭代循环。除非它是一个尾递归循环,并且编译器足够聪明地对它进行优化,例如,g++从-O2开始。

在定义堆栈变量的函数中,栈变量的读取速度可能确实比堆变量快。所有其他函数只接收到指向该变量的指针/引用,这与堆分配变量类似。

将大变量放在堆栈上通常是不明智的,所以我建议采取保守的方法,将数组放在堆上(例如,使用std::vector)。

最后,这个小的差异不太可能影响程序的整体速度。


优化通常是专家的领域,或者至少是那些深入研究分析器并对底层语言语义和硬件以及如何从高级到低级转换有足够理解的人……专家,或者想成为专家:)

  • 更喜欢优化算法而不是它的实现(从一开始)
  • 不要在内存周围(随机)跳跃

如果你的函数仍然太慢,那么…发布一些代码!虽然它可能更适合codereview.stackexchange.com