哪个 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被执行了多次了吗?为什么这不是问题?您如何比较不同事物的性能?如果行为无关紧要,您可以很高兴将 nop
与 themostcomplexComputionInThe
世界进行比较。
我在 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被执行了多次了吗?为什么这不是问题?您如何比较不同事物的性能?如果行为无关紧要,您可以很高兴将 nop
与 themostcomplexComputionInThe
世界进行比较。