为什么java中2D数组的运行速度比1D数组慢很多

为什么java中2D数组的运行速度比1D数组慢很多,java,arrays,primitive-types,Java,Arrays,Primitive Types,对于我的一个需要大内存的程序,我使用了两种不同的实现,如下所示: int SIZE = 1000000000; int[] rnums = new int[SIZE]; byte[] d1 = new byte[2 * SIZE]; byte[] d2 = new byte[2 * SIZE]; int SIZE = 1000000000; int[] rnums = new int[SIZE]; byte[][] d1 = new byte[SIZE][2];

对于我的一个需要大内存的程序,我使用了两种不同的实现,如下所示:

  int SIZE = 1000000000;
  int[] rnums = new int[SIZE];
  byte[] d1 = new byte[2 * SIZE];
  byte[] d2 = new byte[2 * SIZE];


  int SIZE = 1000000000;
  int[] rnums = new int[SIZE];
  byte[][] d1 = new byte[SIZE][2]; 
  byte[][] d2 = new byte[SIZE][2];
两个程序都可以工作并产生正确的答案,但是2D实现非常慢,随着大小的增加,它变得越来越慢


代码的其余部分非常相似,我不明白为什么2D会导致如此多的延迟

根据@David Zimmerman的建议,我已将代码更改为以下代码:

  int SIZE = 1000000000;
  int[] rnums = new int[SIZE];
  byte[][] d1 = new byte[2][SIZE]; 
  byte[][] d2 = new byte[2][SIZE];

它工作正常。

正如@David Zimmerman所建议的,我已将代码更改为以下代码:

  int SIZE = 1000000000;
  int[] rnums = new int[SIZE];
  byte[][] d1 = new byte[2][SIZE]; 
  byte[][] d2 = new byte[2][SIZE];

它工作正常。

在我的例子中,当数组大小在10亿范围内时,速度会慢10倍甚至更多。我看到了这个答案。还有一个问题,它将有助于查看用于访问这些数组的代码,而不仅仅是声明。我能马上想到的速度上的唯一区别是,在2D版本中,对于您访问的每个值,有两个对象被引用,而不仅仅是一个,数组边界检查要做两次而不是一次,但很难想象这些事情加起来会产生10倍的速度差。它必须为第二维度分配20亿个数组。如果你交换坐标(d1=新字节[2][SIZE]),它可能会运行得快得多。也许你不会问“为什么制作和使用十亿个微型数组很慢”,但这里也会发生这种情况,因为
byte[SIZE][2]
并不是真正的2D数组,这是一个数组。在我的例子中,当数组大小在10亿范围内时,速度会慢10倍甚至更多。我看到了这个答案。还有一个问题,它将有助于查看用于访问这些数组的代码,而不仅仅是声明。我能马上想到的速度上的唯一区别是,在2D版本中,对于您访问的每个值,有两个对象被引用,而不仅仅是一个,数组边界检查要做两次而不是一次,但很难想象这些事情加起来会产生10倍的速度差。它必须为第二维度分配20亿个数组。如果你交换坐标(d1=新字节[2][SIZE]),它可能会运行得更快。也许你不会问“为什么制作和使用10亿个微型数组速度慢”,但这里也会发生这种情况,因为
byte[SIZE][2]
不是真正的2D数组,而是数组数组。