为什么从变量获取值而不是从数组中获取值?

时间:2015-07-08 06:29:49

标签: java arrays variables optimization

考虑以下计划:

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]。

但两者都要被抬起头来。

1 个答案:

答案 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])