我想知道让一个数组存储某种数据比存储相同信息的多个数组更有效。
int a1;
int a2;
int b1;
int b2;
int array1[] = {a1, b1, a2, b2}; // Is this faster than 2 arrays?
int array2A[] = {a1, a2};
int array2B[] = {b1, b2};
答案 0 :(得分:4)
这两个数组可能会有更差的缓存内聚(因为它们在内存的不同部分)。他们将使用更少的内存。虽然收益不太可能值得。专注于使您的程序尽可能好,并且架构良好,而不是担心像这样的微小潜在收益,您将获得更好的结果。
答案 1 :(得分:3)
array1
需要3个字节码指令(bipush
,newarray
,astore
),实例化array2X
需要3个字节码指令每个数组( bipush
/ iconst
,newarray
,astore
)。从理论上讲,实例化array1
可以更快。
这是VM为获取array1[2]
所做的工作:
aload_1 ; array1
iconst_2 ; index
iaload ; value
猜猜如何获得array2B[0]
:
aload_3 ; array2B on stack
iconst_0 ; index
iaload ; value
任何人都没有分数。
数组的大小相等(array1
与array2A
+ array2B
一样大),至少是内容的大小。是的,有两个指针而不是一个,一些GC开销等等。不要过多考虑这个问题,你将无法衡量它的差异。
访问两个不同的对象显然会更慢。对此没什么好说的。一个目标绝对是可取的。
使用单个阵列可能会提高整体性能,因为它有时可以保留在堆栈中。但是,JDK编译器似乎避免了堆栈操作并回退到变量。
不会有明显的差异(尽管array1
通常会更快)。以上所有要点都取决于VM的实现。
编写好的代码,不要过度优化。
答案 2 :(得分:2)
我认为在两种情况下,元素的访问都是恒定的时间。但是,对于一个数组,只需要一个指向数组头的指针,因此就内存而言,可以说一个数组实现效率更高。
答案 3 :(得分:1)
单个数组可能更有效:
但是,我严重怀疑收益会超过缺点,而且我也怀疑性能增益(如果有的话)会引人注意,或者会产生任何显着差异。
如果您最终经常计算索引,甚至可能输掉性能。请看以下示例:
// With two arrays
void sumBToA() {
assert array2A.length == array2B.length;
for (int i = 0; i < array2A.length; ++i) {
array2A[i] = array2A[i] + array2B[i];
}
}
// With one array
void sumBToA() {
for (int i = 0; i < array1.length; i += 2) {
array1[i] = array1[i] + array1[i + 1];
}
}
两次内存访问与两次内存访问和一个索引计算。 同样,在大多数情况下,这可能不会产生任何显着差异。