加快代码 - 3D阵列

时间:2010-11-14 21:21:35

标签: java

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

我有一个数组

int cube[][][] = new int[10][10][10];

我填充了值。然后,我访问这些值数千次。

我想知道,因为理论上所有3d数组都存储在内存中的1D数组中,有没有办法将我的3d数组转换为1d数组?例如,我可以将cube [0]引用旧的cube [0] [0] [0]和cube [1]引用旧的cube [0] [0] [1]。

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

由于

5 个答案:

答案 0 :(得分:4)

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

int cube[] = new int[w * h * d];

访问元素:

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

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

答案 1 :(得分:1)

这正是Java在幕后所做的事情。三维数组只是数组数组的数组。从理论上讲,你可以将数组分成10个二维数组或100个一维数组(甚至是1000个单独的数组),但它不太可能加快你的性能。专注于优化算法。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

不要这样做 - Java会为您处理所有这些。您当然可以将它作为一维数组然后进行计算,但是您几乎无法击败在后台执行相同操作的优化JVM代码。此外 - 根据剖析器,这是否真的导致了性能瓶颈?如果没有,您可能会过早优化代码。

答案 4 :(得分:0)

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