【发布时间】:2015-12-01 21:21:55
【问题描述】:
我今天偶然发现了这个案例,我想知道这个巨大的时间差异背后的原因是什么。
第一个版本初始化一个 5k x 5k 的原始整数数组:
public void initializeRaw() {
int size = 5000;
int[][] a = new int[size][size];
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
a[i][j] = -1;
}
在我的机器上大约需要 300 毫秒。 另一方面,用简单的 2-int 结构初始化同一个数组:
public class Struct { public int x; public int y; }
public void initializeStruct() {
int size = 5000;
Struct[][] a = new Struct[size][size];
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
a[i][j] = new Struct();
}
占用超过 15000 毫秒。
我希望它会慢一点,毕竟要分配的内存更多(如果我没记错的话,是 10 个字节而不是 4 个字节),但我不明白为什么要花 50 倍的时间。
谁能解释一下?也许有更好的方法来在 Java 中进行这种初始化?
编辑:为了进行一些比较 - 使用 Integer 而不是 int/Struct 的相同代码的工作时间为 700 毫秒 - 只慢了两倍。
【问题讨论】:
-
在后面的代码中,
Struct的构造函数被调用了(size)^2次,原因之一…… -
我很想看看 Integer 的性能,可能会指出为什么在所有条件相同的情况下首选基元。
-
您在欺骗自己,称您的类为结构。它仍然是一个类,并且随之而来的是所有的初始化开销。
-
-verbose:gc会解释很多 -
是的,它带来了开销,但为什么这么大?如果我理解正确,使用 Integer 应该会产生类似的开销,但实际上它只有 ~700ms - 比 50 慢 2 倍。
标签: java arrays performance