For-loop Length局部变量微优化?

时间:2011-04-09 07:12:47

标签: language-agnostic for-loop micro-optimization

在许多编程语言及其微优化中,我已经看到在for循环中声明数组的长度会对性能产生影响,尤其是在PHP和JavaScript中:

for i = 0, length = arr.length; i < length; ++i

我已经看到了C ++中使用的这种格式以及一些Java源代码。这种微优化是否适用于所有编程语言?如果这是一个与语言无关的微优化,那么它是不是已经从编译器中进行了优化?

2 个答案:

答案 0 :(得分:0)

好吧,我认为Java编译器会关注这种优化,但事实并非如此:

public static void main(String[] args) {
    String[] array = new String[10000000];
    Arrays.fill(array, "Test");
    long startNoSize = Calendar.getInstance().getTimeInMillis();
    for(int i=0; i< array.length;i++)
    {
        array[i]=String.valueOf(i+1);
    }
    long finishNoSize = Calendar.getInstance().getTimeInMillis();
    System.out.println(finishNoSize-startNoSize);
    System.out.println("Size saved");
    int length = array.length;
    long startSize = Calendar.getInstance().getTimeInMillis();
    for(int i=0; i< length;i++)
    {
        array[i]=String.valueOf(i+2);
    }
    long finishSize = Calendar.getInstance().getTimeInMillis();
    System.out.println(finishSize-startSize);
}

连续几次运行后,结果如下:

6207
Size saved
4594

因此存在1500毫秒的差异。

<强>更新 当循环反转时,结果也相反:) 所以缺乏优化没有问题。

因此在Java中调用Container.size不会影响性能。

答案 1 :(得分:0)

编译器的问题是知道arr.length将在循环中的每次迭代返回相同的内容。例如,有时它不会在循环体将新元素插入arr时。