【发布时间】:2009-02-23 18:45:05
【问题描述】:
例如,一个完整的 int[50][8] 会比 8 个完整的 int[50] 数组使用更多的资源(RAM 和 CPU)吗?
【问题讨论】:
-
你有一些我们可以测试的代码示例吗?
-
你想达到什么目的?如果您遇到性能问题,可能不是因为您组织数组的方式。
例如,一个完整的 int[50][8] 会比 8 个完整的 int[50] 数组使用更多的资源(RAM 和 CPU)吗?
【问题讨论】:
在第一种情况下,您有一个数组对象指向 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 个字节的开销。
但是,对于您在这里的尺寸,这并不重要。无论哪种方式,您都不会节省太多。
【讨论】: