问题是要求对for
和while
循环的费用进行比较,相对于if
语句的费用。
假设if语句的相对成本为1,for和while循环的相对成本是多少?
假设在比较时将单个布尔值传递到while
循环和if
语句,并允许while
迭代X次。假设for
也迭代X次。
答案 0 :(得分:9)
就性能而言,if
语句通常具有O(1)复杂度,其中for
和while
循环通常为O(n),其中n是它取决于条件是什么循环。例如:
for (int i = 0; i < 100; i++)
{
// Some statements
}
将是O(100),因为它循环了100次。 for
循环中有多少语句无关紧要,除非在初始循环中有其他循环。然后你得到O(n ^ 2)复杂度,这是二次的,因此非常低效。
但是,不要让这吓到你。循环存在是有原因的,并且在许多程序中它们是必需的。
答案 1 :(得分:0)
循环是语言结构。您可以编写while
循环来执行与for
循环相同的操作,反之亦然。
假设if语句的相对成本为1,for和while循环的相对成本是多少?
for
循环和while
循环也会检查条件。从这个意义上说,它们的成本也是1
。关键是循环中通常存在一些会影响该条件的东西。
考虑这段代码
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
}
System.out.println("");
int i = 0;
while (i < 10) {
i++;
}
}
生成的字节码是
// start for
0: iconst_0
1: istore_1
2: iload_1
3: bipush 10
5: if_icmpge 14
8: iinc 1, 1
11: goto 2
// end for
14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
17: ldc #3 // String
19: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
// start while
22: iconst_0
23: istore_1
24: iload_1
25: bipush 10
27: if_icmpge 36
30: iinc 1, 1
33: goto 24
36: return
// end while
您会注意到两个循环完全相同并生成完全相同的字节码。