例如,一个完整的int [50] [8]会使用比8个完整的int [50]数组更多的资源(RAM和CPU)吗?
答案 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个字节。
然而,对于你在这里的尺寸,它确实没关系。无论如何,你都不会节省太多。