首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java性能/内存消耗:类与数组

Java性能/内存消耗:类与数组
EN

Stack Overflow用户
提问于 2015-10-08 00:19:46
回答 3查看 3.3K关注 0票数 4

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

不考虑设计模式(非常简化的情况),假设我可以存储数据,例如

代码语言:javascript
复制
class MyContainer {
  public double a;
  public double b;
  ...
}

然后

代码语言:javascript
复制
MyContainer[] myArray = new MyContainer[10000];
for(int i = myArray.length; (--i) >= 0;) {
  myArray[i] = new MyContainer();
}
...

对比

代码语言:javascript
复制
double[][] myData = new double[10000][2];  
...

我认为基于数组的方法应该更紧凑(内存)和更快(访问)。但是,也许不是,数组也是对象,数组访问需要检查索引,而对象成员访问不需要。(?)对象数组的分配可能会(?)需要花费更长的时间,因为我需要迭代地创建实例,而且由于额外的类,我的代码会更大。

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

非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-08 00:25:14

再说一遍,也许不是,数组也是对象

没错。所以我认为这种方法不会给你买任何东西。

如果你想沿着这条路走下去,你可以把它夷为平地,变成一个一维数组(每个“对象”都有两个插槽)。这将使您可以立即访问所有对象中的所有字段,而不必遵循指针,整个过程只是一个大内存分配:由于组件类型是原始的,就内存分配而言,只有一个对象(容器数组本身)。

这是people 希望在Java中具有结构和值类型的动机之一,类似的考虑因素推动了专门的高性能数据结构库的开发(该库摆脱了不必要的对象包装)。

不过,我不会担心这个问题,除非你真的有一个庞大的数据结构。只有这样,面向对象方式的开销才会变得重要。

票数 4
EN

Stack Overflow用户

发布于 2015-10-08 02:37:16

我认为基于数组的方法应该更紧凑(内存)和更快(访问)。

您可以很容易地通过使用Java Management接口来确认这一点:

代码语言:javascript
复制
com.sun.management.ThreadMXBean b = (com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
long selfId = Thread.currentThread().getId();
long memoryBefore = b.getThreadAllocatedBytes(selfId);

// <-- Put measured code here

long memoryAfter = b.getThreadAllocatedBytes(selfId);
System.out.println(memoryAfter - memoryBefore);

在度量的代码中,放置new double[0]new Object(),您将看到这些分配将需要完全相同的内存量。

JVM/JIT可能以一种特殊的方式对待数组,这可以使它们以某种方式更快地访问。

JIT做一些数组操作的矢量化(如果是for-循环)。但更多的是算术运算的速度,而不是访问的速度。除此之外,我什么都想不起来。

票数 3
EN

Stack Overflow用户

发布于 2015-10-08 02:56:40

我在这种情况下看到的典型建议是,过早的优化是万恶之源。这意味着您应该坚持最容易编写/维护/通过代码质量管理的代码,如果您有可衡量的性能问题,则考虑优化。

在您的示例中,内存消耗类似,因为在对象情况下,每个引用有10,000个引用加上两个双引用,而在2D数组中,对包含两个双倍的小数组有10,000个引用(第一个维度)。所以两者都是一个基参考加上10,000个参考加上20,000倍。

更有效的表示形式是两个数组,其中有两个基本引用加上20,000双。

代码语言:javascript
复制
double[] a = new double[10000];
double[] b = new double[10000];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33004572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档