2D阵列比Java中的1D阵列使用更多资源吗?

时间:2009-02-23 18:45:06

标签: java arrays resources cpu

例如,一个完整的int [50] [8]会使用比8个完整的int [50]数组更多的资源(RAM和CPU)吗?

6 个答案:

答案 0 :(得分:4)

在第一种情况下,你有一个数组对象指向50个数组对象,持有8个int。 所以1 + 50个数组对象+第一个数组对象中的50个指针。

在第二种情况下,你有一个数组对象指向8个数组对象,持有50个int。 所以1 + 8个数组对象+第一个数组对象中的8个指针。拿着int是洗。

没有一种很好的方法来评估CPU的使用情况。

答案 1 :(得分:1)

这里似乎有三件事要比较。

  • new int[50][8]
  • new int[8][50]
  • new int[400]

现在,我对此感到困惑,但要记住的方法是考虑有效的new int[50][]

所以new int[50][8]是一个包含50个大小为8的数组(51个对象)的数组。 new int[8][50]是一个包含8个大小为50的数组(9个对象)的数组。 9个对象的开销低于51. new int[400]只是一个对象。

但是,在这个尺寸下,它可能不会对程序的性能产生任何可测量的差异。您可能希望将数组封装在一个对象中,该对象允许您更改实现并为客户端代码提供更自然的接口。

答案 2 :(得分:1)

另外一个使用点(来自参考文献,我很遗憾现在找不到,但相当常见) -

本文的作者正在测试将稀疏数组压缩为多维数组的各种方法。他们注意到的一件事是,它在速度方面有所不同,你可以通过哪种方式进行迭代 -

这个想法是,如果你有int [i] [j],那么做得更快

for (i) { 
     for (j)

而非

for (j) { 
     for (i)

因为在第一个实例中,您正在迭代连续存储的元素。

答案 3 :(得分:0)

你可以通过使用int [] myInt = int [400]数组调整一小部分内存,并使用myInt [x + y * 50]手动访问位置(x,y)的int 这将节省50个32位内存。以这种方式访问​​它(可能确切地知道热点编译器对此做了什么......)再接受一次乘法指令。

这种微优化很可能不会让您的应用效果更好,而且会降低可读性。

答案 4 :(得分:0)

我建议用非常大的数组为此编写一个小的性能测试,以查看实际的差异。实际上,我认为这不会产生丝毫差异。

答案 5 :(得分:0)

int [50] [8]是50个长度为8的数组 int [8] [50]是8个长度为50的数组 int [400]是一个数组400。 每个数组的开销大约为16个字节。

然而,对于你在这里的尺寸,它确实没关系。无论如何,你都不会节省太多。