例如,一个完整的 int[50][8] 会比 8 个完整的 int[50] 数组使用更多的资源(RAM 和 CPU)吗?
6 回答
在第一种情况下,您有一个数组对象指向 50 个包含 8 个 int 的数组对象。所以第一个数组对象中有 1 + 50 个数组对象 + 50 个指针。
在第二种情况下,您有一个数组对象指向 8 个包含 50 个 int 的数组对象。所以第一个数组对象中有 1 + 8 个数组对象 + 8 个指针。持有 int 是一种洗涤。
没有一个好的方法来评估 CPU 使用率。
这里似乎有三件事可以比较。
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]
只是一个对象。
但是,在这种大小下,它可能不会对您的程序性能产生任何可衡量的差异。您可能希望将数组封装在一个对象中,这将允许您更改实现并为客户端代码提供更自然的接口。
一个额外的使用点(来自我现在找不到的参考资料,但相当常识) -
本文的作者正在测试将稀疏数组压缩为多维数组的各种方法。他们注意到的一件事是,迭代的速度会有所不同——
这个想法是,如果你有 int[i][j] 这样做会更快
for (i) {
for (j)
比做
for (j) {
for (i)
因为在第一个实例中,您正在遍历连续存储的元素。
您可以通过使用 int[] myInt = int[400] 数组来调整少量内存,并使用 myInt[x+y*50] 手动访问位置 (x,y) 处的 int,这将为您节省 50 32-一点点记忆。以这种方式访问它可能会(谁知道热点编译器对此做了什么..)需要多一条指令来进行乘法运算。
这种微优化很可能不会使您的应用程序性能更好,并且会降低可读性。
我建议为此使用非常大的数组编写一个小型性能测试,以查看实际差异。实际上,我认为这不会有丝毫不同。
int[50][8] 是 50 个长度为 8 的数组 int[8][50] 是 8 个长度为 50 的数组 int[400] 是一个数组 400。每个数组有大约 16 个字节的开销。
但是,对于您在这里的尺寸,这并不重要。无论哪种方式,您都不会节省太多。