考虑以下计划:
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循环时,
第一个print语句将引用位置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
而不是每次调用数组[0]。
但两者都要被抬起头来。
答案 0 :(得分:3)
访问array[i]
时,处理器必须查找array
的内存地址,然后将i
添加到该地址以获取您请求的变量。
访问x
时,处理器可以直接从x
获取变量。
在Java中,只有基元存储在堆栈中,因此array
将是指向堆上某些内容的指针,而x
将存储在堆栈中。这仅适用于x
是原始的情况。如果array
包含对象(并且x
因此是指向对象的指针),则两者都将存储在堆上。
所以主要区别在于,当访问array[i]
时,您将访问阵列加上我,但访问x
时,您将成为访问 location-of-x 。值得注意的是,array[0]
(或任何其他固定索引)通常可以优化为单个指令。
现在,你应该担心吗?不,绝对不是。在这两种方式之间甚至不可能存在可衡量的性能差异,即使性能差异极不可能影响到您 - 您的应用程序可能比仅仅访问内存中的变量要花费更多时间。编译器也很可能优化它以减少所需的内存查找次数,处理器缓存也将起作用。
最好写一些类似的东西:
int x = array[0]
int y = array[1]
int result = x + y + x * y + x * (x - y)
它是否比以下更具可读性
int result = array[0] + array[1] + array[0] * array[1] + array[0] * (array[0] - array[1])