我在Android文档中看到以下内容:
int n = getCount();
for (int i = 0; i < n; i ++) {
// do somthing
}
但我习惯于看到和做:
for (int i = 0; i < getCount(); i ++) {
// do somthing
}
我很好奇一个人是否比另一个人更有效率?在这两种情况下究竟发生了什么?当您以第二种方式呼叫getCount()
时,计算机是否必须分配另一个变量?或者仅仅是代码清洁度或偏好的问题?
答案 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被多次执行?为什么不是问题?你如何比较不同事物的表现?如果行为无关紧要,您可以将nop
与themostcomplexComputionInThe
世界进行比较。
答案 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()
执行一些复杂操作以返回其值时。