哪个for循环标题表现更好?

时间:2015-02-13 18:36:56

标签: java for-loop compiler-optimization

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

int n = getCount();

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

但我习惯于看到和做:

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

我很好奇一个人是否比另一个人更有效率?在这两种情况下究竟发生了什么?当您以第二种方式呼叫getCount()时,计算机是否必须分配另一个变量?或者仅仅是代码清洁度或偏好的问题?

3 个答案:

答案 0 :(得分:2)

第一个比另一个更有效。

在第一个场景中,您只调用一次getCount,而在第二个场景中,您为每个条件检查调用getCount,这会增加循环的执行时间。

答案 1 :(得分:2)

这个问题不是表现,第二个可能会慢一点,因为

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世界进行比较。

答案 2 :(得分:1)

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

第一种情况:

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()执行一些复杂操作以返回其值时。