【发布时间】:2015-07-08 17:40:51
【问题描述】:
考虑以下程序:
int []array = {10, 20, 30, 40, 50};
int x = array[0];
for(int i = 0; i < array.length; i++)
{
System.out.println(x * array[i]);
System.out.println(array[0] * array[i]);
}
当一个数组被声明时,它被存储在一起驻留的内存中。
array: [0] [1] [2] [3] [4]
Value: 10 20 30 40 50
Location: 100 102 104 106 108
现在当 x 被赋值为 array(10) 的第一个元素时。
x 在内存中存储了一个值为10 的值。
variable : x
Value : 10
Location : 120
现在当我们调用 for 循环时,
第一个打印语句将引用位置120 的值并说我有一个值10。
第二个打印语句还将引用位置100,并说它有一个值10。
当两个语句每次都必须寻找内存位置时,为什么第一个语句会更优化?
编辑
如果x被多次使用,在同一个程序中。
int []array = {10, 20, 30, 40, 50};
int x = array[0];
for(int i = 0; i < array.length; i++)
{
System.out.println(x * array[i] + (x + 1) * array[i] - ( x + 2));
System.out.println(array[0] * array[i] + (array[0] + 1) * array[i] - (array[0] + 2));
}
这里 x 被多次使用。所以人们更喜欢使用x,而不是每次都调用array[0]。
不过,两者都必须查。
【问题讨论】:
-
如果你有一个愚蠢的编译器,我想你可以消除重复的内存访问。
-
如果我们谈论的是未优化的编译,Java会在每个索引处检查数组索引的范围。
-
不是优化偏好,它们的复杂度是一样的~,就是遵守DRY原则。 en.wikipedia.org/wiki/Don't_repeat_yourself
-
因为我们不直接访问数组,首先 jvm 正在搜索数组的引用,然后创建位于不同位置(主要在堆中)的数组对象。但是局部变量驻留在堆栈中。所以显然变量会更有效。@UmaKanth
-
这个问题没有通过97/3 rule:不感兴趣。
标签: java arrays variables optimization