Java阵列效率

时间:2013-03-23 10:38:40

标签: java multidimensional-array performance memory-efficient

我对这个机制并不是100%肯定所以我决定在这里发布以进一步澄清。

我正在做一个应该用Java处理大量数据的项目(它必须是Java)。我希望它尽可能高效。有效率我的意思是内存和速度计算应首先进入,可读性应该排在第二位。

现在我有两种方法来存储我的数据:创建一个MyObject

的数组
1) MyObject[][] V = new MyObject[m][n]

或者创建两个int数组:

2) int[][] V = new int[m][n]

3) int[][] P = new int[m][n]

显然MyObject包含至少两个字段和一些方法。现在我注意到,在循环MyObject数组以分配值时,我必须调用new,否则我会得到一个空指针异常。这意味着第1行中的new不够。考虑到数组也是Java中的对象,这是一个比参数更加昂贵的操作P[i][j]=n吗?

4 个答案:

答案 0 :(得分:4)

我经常通过分析发现,用几个标量数组替换一个对象数组可以提高内存消耗和性能。

但是,在您的情况下,只有分析才能判断它是否值得进行优化。

一个好的分析器可以让你测量代码的性能和内存占用量。

答案 1 :(得分:2)

  
    

这是一个比参数更昂贵的操作,P [i] [j] = n,考虑到数组也是Java中的对象吗?

  

在第一种情况下,您创建一个数组对象,用于存储类型为array的其他对象。数组对象和要存储在数组中的对象都需要实例化,这意味着您将需要m * n + 1对象实例化以及(m * n + 1) * objectSize内存消耗。

在第二种情况下,您只需要实例化数组对象; int基元不是对象,所以这应该更快,也更高效,因为对象内存大小是int的几倍。这里你基本上有1个对象实例化和(m * n) * intSize + objectSize内存消耗。

使用原语的另一个原因是,当用作局部变量时,它们保留在堆栈中;在将计算值存储到数组中之前,您可能会在方法中使用中间局部变量,并且这些变量的内存的分配/释放时间比堆上的对象的分配/释放时间高几倍。

答案 2 :(得分:1)

为了快速处理真正大量的数据,最好将数据放在一个连续的内存块中,使得您一起访问的数据彼此接近。这应该最大限度地减少缓存未命中,这是当今性能最差的杀手之一。

在java中,您只需使用一个基本的一维基本数组即可实现此目的。如果使用两个数组甚至是二维数组,则不再保证数据位于一个连续的块中。

另一个稍微复杂一点的解决方案是使用堆外数据结构,例如:http://mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html

答案 3 :(得分:0)

首先,您必须在java而不是数组中使用List或Set ie Collections。因为您可能不知道需要处理的数据大小。此外,集合具有API方法,允许您像插入元素或删除元素一样轻松执行操作。使用数组非常复杂且容易出错,因为您可能需要反复迭代它,并且还必须在编译时确定大小,如果您有可变大小的数据,这是不可能的。

此外,在运行时分配内存(即使用new关键字)比将该值分配给已存在的对象(即p [i] [j] = v;

)要贵