单个阵列比2个不同阵列更快吗?

时间:2014-01-18 23:39:59

标签: java arrays performance

我想知道让一个数组存储某种数据比存储相同信息的多个数组更有效。

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};

4 个答案:

答案 0 :(得分:4)

这两个数组可能会有更差的缓存内聚(因为它们在内存的不同部分)。他们将使用更少的内存。虽然收益不太可能值得。专注于使您的程序尽可能好,并且架构良好,而不是担心像这样的微小潜在收益,您将获得更好的结果。

答案 1 :(得分:3)

实例化

嗯,你可以争论这个。实例化array1需要3个字节码指令(bipushnewarrayastore),实例化array2X需要3个字节码指令每个数组bipush / iconstnewarrayastore)。从理论上讲,实例化array1 可以更快。

访问

这是VM为获取array1[2]所做的工作:

aload_1  ; array1
iconst_2 ; index
iaload   ; value

猜猜如何获得array2B[0]

aload_3  ; array2B on stack
iconst_0 ; index
iaload   ; value

任何人都没有分数。

内存

数组的大小相等(array1array2A + 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];
    }
}

两次内存访问与两次内存访问一个索引计算。 同样,在大多数情况下,这可能不会产生任何显着差异。