gpt4 book ai didi

java - 大型小对象数组的初始化缓慢

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:23:37 25 4
gpt4 key购买 nike

我今天偶然发现了这个案例,我想知道这个巨大的时间差异背后的原因是什么。

第一个版本初始化一个 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 中有更好的方法来进行这种初始化?

编辑:对于某些比较 - 使用整数而不是 int/Struct 的相同代码工作 700 毫秒 - 只慢两倍。

最佳答案

I would expect it to be a bit slower, after all there is more memory to allocate (10 bytes instead of 4 if I'm not mistaken), but I cannot understand why could it take 50 times longer.

不,比那更糟。在第一种情况下,您要创建 5001 个对象。在第二种情况下,您将创建 25,005,001 个对象。我怀疑每个 Struct 对象都将占用 16 到 32 个字节。 (这将取决于各种 JVM 细节,但这是一个粗略的猜测。)

在第一种情况下,您的 5001 个对象总共需要约 100MB。如果您使用的是具有 64 位引用的平台,则等效对象(数组)可能总共需要约 200MB 的空间……然后还有其他 2500 万个对象需要分配和初始化。

所以是的,差别很大...

关于java - 大型小对象数组的初始化缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com