Java 加速代码-三维阵列

Java 加速代码-三维阵列,java,Java,我正在努力提高我编写的一些代码的速度。我想知道从三维整数数组访问数据有多高效 我有一个数组 int-cube[][]=新的int[10][10][10] 我用值填充它。然后我访问这些值数千次 我想知道,由于所有3d阵列理论上都存储在内存中的一维阵列中,有没有办法将我的3d阵列转换为一维阵列?例如,我可以让多维数据集[0]引用旧多维数据集[0][0][0],让多维数据集[1]引用旧多维数据集[0][0][1] 我不知道该怎么做。我相信这是可能的,但我的大脑已经疲惫不堪了 谢谢您可以按如下方式创建一

我正在努力提高我编写的一些代码的速度。我想知道从三维整数数组访问数据有多高效

我有一个数组

int-cube[][]=新的int[10][10][10]

我用值填充它。然后我访问这些值数千次

我想知道,由于所有3d阵列理论上都存储在内存中的一维阵列中,有没有办法将我的3d阵列转换为一维阵列?例如,我可以让多维数据集[0]引用旧多维数据集[0][0][0],让多维数据集[1]引用旧多维数据集[0][0][1]

我不知道该怎么做。我相信这是可能的,但我的大脑已经疲惫不堪了


谢谢

您可以按如下方式创建一维数组:

int cube[] = new int[w * h * d];
和访问元素:

int value = cube[x * h * d + y * d + z];

但我怀疑它会快得多,你会失去一些便利和安全。在决定进行此更改之前,最好对您的数据执行一些基准测试,看看您是否真的有问题,以及更改是否提供了足够大的改进,值得付出额外的复杂性。

不要这样做-Java为您处理所有这些。当然,您可以将其设置为1D数组,然后进行计算,但您很难击败在后台执行相同操作的优化JVM代码。此外-根据分析器,这真的会导致性能瓶颈吗?否则,您可能会过早地优化代码。

这正是Java在幕后所做的。三维数组就是数组的数组。理论上,您可以将数组分为10个二维数组或100个一维数组(甚至可以分为1000个单独的变量),但这不太可能提高性能。专注于优化你的算法

int cube[] = new int[ X*Y*Z ];
cube[ i*X*Y + j*X + k ] = ...

但是,正如其他人已经说过的那样:预计不会更快(因为无论如何都必须进行计算)。为了避免错误,让Java自己做吧。

您可以使用LinkedList并在每个节点中存储一个2D数组。我相信这样会更有效率。

你有证据证明它很慢吗?这(问题是)与Java当时的做法相反——没有Nd->1d mapping.Oops。我误解了这个问题。不过,我认为我的答案仍然适用。无论您如何转换数据(除了使用getter和setter来处理所有可能会破坏性能的事情),OP都不会得到太多好处。对于一个简单的循环,将随机数分配给数组中的随机位置10000000次,在我的计算机上,一维版本实际上要快一些(3.6秒而不是4.6秒)。我怀疑在一个只访问数据“几千次”的程序中,是否值得费心去做……而且不要忘记基于使用模式和大小的缓存命中/未命中。。。CPU是一个多么易变的东西。我同意你的建议,但我认为它会更快。我的理由是:Java中的所有多维数组都是锯齿状的,因此获取元素涉及指针解引用,而不仅仅是乘法。它不能使用乘法,请考虑执行以下语句后会发生什么:
cube[2][3]=newint[42]。当所有数组都可以有不同的大小时,JVM将如何使用乘法计算出正确的内存地址?@Ramon:这一点很好!我修改了答案末尾的警告。正如我对Mark Byers答案的评论所指出的,使用1D数组实际上可以击败微基准中的“优化JVM代码”。但实际上,这不太可能提高性能,这是对的。LinkedList中的索引查找是O(n)。这对3d阵列来说太可怕了!