Language agnostic 对于循环长度局部变量微优化?

Language agnostic 对于循环长度局部变量微优化?,language-agnostic,for-loop,micro-optimization,Language Agnostic,For Loop,Micro Optimization,在许多编程语言及其微优化中,我已经看到在for循环中声明数组的长度会影响性能,特别是在PHP和JavaScript中: for i = 0, length = arr.length; i < length; ++i 对于i=0,长度=arr.length;i

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

for i = 0, length = arr.length; i < length; ++i
对于i=0,长度=arr.length;i<长度++我

<>我看到了C++中使用的格式以及一些java源代码。这种微优化对所有编程语言都适用吗?如果这是一种与语言无关的微优化,那么它是否应该从编译器内部进行优化呢?

我认为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);
}
所以有1500毫秒的差异

更新 当循环反转时,结果也会反转:) 因此,不存在缺乏优化的问题


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

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

时,与我的计算机的结果相同,但仍然是错误的。切换两个测试用例,情况正好相反。所以实际上是一个“冷”jre的问题。我理解不使用这种格式的意义,但它是非变异例程中最常见的for循环实现之一。这种格式很乏味,而且跨越了文本编辑器。我希望至少有一个编译器可以对此进行优化(因为每个循环都是任意的,因为它们不能保证顺序)。
6207
Size saved
4594