pol*_*nts 7 java arrays performance multidimensional-array
当我在大学里使用C++时,我被告知尽可能使用多维数组(特此是MDA),因为它表现出更好的内存局部性,因为它分配在一个大块中.另一方面,阵列阵列(AoA)被分配在多个较小的块中,可能散布在物理存储器中的任何位置,无论何处发现空位.
所以我想第一个问题是:这是一个神话,还是值得关注的建议?
假设它是后者,那么接下来的问题就是如Java这样没有真正MDA的语言.当然,用1DA模拟MDA并不难.从本质上讲,具有MDA的语言的语法糖可以实现为对没有MDA的语言的库支持.
这值得努力吗?对于像Java这样的语言来说,这是一个太低的优化问题吗?我们应该放弃数组并使用List
s甚至原语吗?
另一个问题:在Java中,一次分配AoA(new int[M][N]
)可能会产生不同的内存分配(而不是分层次地)(new int[M][]; for (... new int[N]
)
Java 和 C# 分配内存的方式与 C++ 非常不同。事实上,在 .NET 中,如果 AoA 的所有数组被依次分配,那么它们肯定会靠近在一起,因为内存只有一个连续的块,没有任何碎片。
但对于 C++ 来说仍然如此,并且如果您想要最大速度,仍然有意义。尽管您不应该每次需要多维数组时都遵循该建议,但您应该首先编写可维护的代码,然后在速度缓慢时对其进行分析,但过早的优化是这个世界上万恶之源。