gpt4 book ai didi

Java 性能/内存消耗 : Class vs. 数组

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

出于兴趣:最近,我在我的一个 Java 项目中遇到了一种情况,我可以将一些数据存储在二维数组中,或者为其创建一个专用类,我将其实例放入一维数组中.所以我想知道在性能(运行时、内存消耗)方面是否存在关于这个主题的一些规范设计建议?

不考虑设计模式(极其简化的情况),假设我可以像这样存储数据

class MyContainer {
public double a;
public double b;
...
}

然后

MyContainer[] myArray = new MyContainer[10000];
for(int i = myArray.length; (--i) >= 0;) {
myArray[i] = new MyContainer();
}
...

对比

double[][] myData = new double[10000][2];  
...

不知何故,我认为基于数组的方法应该更紧凑(内存)和更快(访问)。再一次,也许不是,数组也是对象,数组访问需要检查索引,而对象成员访问则不需要。(?)对象数组的分配可能(?)需要更长的时间,因为我需要迭代创建由于增加了类,实例和我的代码会更大。

因此,我想知道在访问速度和内存消耗方面,常见 JVM 的设计是否为一种方法提供了优于另一种方法的优势?

非常感谢。

最佳答案

Then again, maybe it is not, arrays are objects too

没错。所以我认为这种方法不会给你带来任何好处。

如果你想沿着这条路走下去,你可以把它展平成一个一维数组(你的每个“对象”然后占用两个槽)。这将使您可以立即访问所有对象中的所有字段,而不必遵循指针,并且整个事情只是一个大内存分配:因为您的组件类型是原始的,所以就内存分配而言只有一个对象(容器数组本身)。

这是人们的动机之一wanting to have structs and value types in Java ,以及类似的考虑插入了专门的高性能数据结构库的开发(摆脱了不必要的对象包装器)。

不过,在您真正拥有庞大的数据结构之前,我不会为此担心。只有这样,面向对象方式的开销才会重要。

关于Java 性能/内存消耗 : Class vs. 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33004572/

25 4 0
文章推荐: java - 使用 Spring REST Docs 记录分层 JSON 负载
文章推荐: java - 如何在 Java 中将 List 转换为 List