哪个 for 循环头执行得更好?

Which for loop header performs better?

我在 Android 文档中经常看到以下内容:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do somthing
}

但我已经习惯了看到和做:

for (int i = 0; i < getCount(); i ++) {
    // do somthing
}

我很好奇一个是否比另一个更有效?这两种情况到底发生了什么?第二种方式调用getCount()时,计算机是不是要再分配一个变量?还是仅仅是代码清洁度或偏好的问题?

这是 JDK1.6 的 javac 编译器。0_21 为两种情况生成的内容:

第一种情况:

int n = getCount();

for (int i = 0; i < n; i ++) {
    // do something
}

编译后的字节码:

invokestatic example/Test/getCount()I
istore_1
iconst_0
istore_2
goto 10
... // whatever code in the loop body
iinc 2 1
iload_2
iload_1
if_icmplt 6
return

第二种情况:

for (int i = 0; i < getCount(); i ++) {
    // do something
}

编译后的字节码:

iconst_0
istore_1
goto 8
... // whatever code in the loop body
iinc 1 1
iload_1
invokestatic example/Test/getCount()I
if_icmplt 4
return

看起来生成的代码可能不同,但取决于 getCount(),运行时可能会优化执行。一般来说,第一个代码似乎更有效率,尤其是当 getCount() 对 return 它的值进行一些复杂的操作时。

第一个比另一个更有效率。

在第一种情况下,您只调用一次 getCount,而在第二种情况下,您为每次条件检查都调用 getCount,这会增加循环的执行时间。

问题不在于性能,认为第二个可能更慢,因为

public class stuff {
    static int getCount() {
        System.out.println("get count");
        return 5;
    }
    public static void main(String[] args) {
        for (int i = 0; i < getCount(); i ++) {
            System.out.println("loop " + i);
        }
    }

}

有输出

get count
loop 0
get count
loop 1
get count
loop 2
get count
loop 3
get count
loop 4
get count

你看到循环中的getCount被执行了多次了吗?为什么这不是问题?您如何比较不同事物的性能?如果行为无关紧要,您可以很高兴将 nopthemostcomplexComputionInThe 世界进行比较。