【问题标题】:For-loop Length Local Variable Micro Optimization?For-loop 长度局部变量微优化?
【发布时间】:2011-04-09 07:12:47
【问题描述】:

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

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

我在 C++ 和一些 Java 源代码中也看到过这种格式。这种微优化是否适用于所有编程语言?如果这是一个与语言无关的微优化,它不应该已经在编译器中进行了优化吗?

【问题讨论】:

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


    【解决方案1】:

    好吧,我以为 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 不会影响性能。

    【讨论】:

    • 与我的计算机结果相同,但仍然错误。切换两个测试用例,情况正好相反。所以实际上是“冷”jre的一个问题。
    【解决方案2】:

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

    【讨论】:

    • 我理解不使用这种格式的意义,但它是非变异例程最常见的 for 循环实现之一。这种格式很乏味,而且跨越了文本编辑器。我希望至少有一个编译器可以对此进行优化(for-each 循环是任意的,因为它们不保证顺序)。
    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多