Javaarrays效率

我对行动机制并不是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 ,否则我会得到一个空指针exception。 这意味着第1行中的new是不够的。 考虑到数组也是Java中的对象,为了论证,这是一个比P[i][j]=n更昂贵的操作吗?

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

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

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

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

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

但是,只有剖析可以判断它是否值得在您的情况下进行优化。

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

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

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

另一个稍微涉及更多的解决方案是使用堆外数据结构,如下所示: http : //mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html

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

此外,在运行时分配内存(即使用新关键字)是昂贵的,然后只是将值分配给已存在的对象,即p [i] [j] = v;