for循环有多贵?

时间:2014-11-18 16:39:34

标签: java performance if-statement for-loop while-loop

问题是要求对forwhile循环的费用进行比较,相对于if语句的费用。

假设if语句的相对成本为1,for和while循环的相对成本是多少?

假设在比较时将单个布尔值传递到while循环和if语句,并允许while迭代X次。假设for也迭代X次。

2 个答案:

答案 0 :(得分:9)

就性能而言,if语句通常具有O(1)复杂度,其中forwhile循环通常为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

您会注意到两个循环完全相同并生成完全相同的字节码。