【问题标题】:How expensive are for and while loops? [closed]for 和 while 循环有多贵? [关闭]
【发布时间】:2015-01-15 22:34:57
【问题描述】:

问题是要求比较 forwhile 循环的成本,相对于 if 语句的成本。

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

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

【问题讨论】:

  • 你可以自己计时看看..也
  • 循环中的单个布尔值会发生什么?如果不修改,它们基本上都是 if 语句。如果被修改,if 语句执行一次,while /for 可能执行多次(显然,这就是为什么它真的不清楚你实际上在问什么)
  • 但它们没有可比性! if 语句最多执行一次,fo​​r/while 循环可能执行多次。

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


【解决方案1】:

就性能而言,if 语句的复杂度通常为 O(1),而 forwhile 循环通常为 O(n),其中 n 是循环的数量,具体取决于什么条件是。例如:

for (int i = 0; i < 100; i++)
{
    // Some statements
}

将是 O(100),因为它循环了 100 次。 for 循环中有多少语句并不重要,除非初始循环中有其他循环。然后你会得到 O(n^2) 复杂度,这是二次的,因此效率很低。

但是,不要让这吓到您。循环的存在是有原因的,它们在许多程序中都是必需的。

【讨论】:

  • @laiello - 不……我知道。只是太简短了。也许我们会很快判断
  • 如果你需要循环 100 次,它肯定会比 100 个 if 语句更干净。此外,除非您正在做一些非常密集的事情,否则您几乎不会注意到与当今计算机的这些时间差异。
  • 我同意,但我恳请你去找一位算法教授,对他说“循环复杂度无关紧要”。也许不是对于整体程序,但在计算机科学中,它非常重要。
【解决方案2】:

循环是语言结构。您可以编写一个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

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

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2016-03-25
    • 2014-03-22
    • 1970-01-01
    • 2017-02-19
    • 2020-09-17
    相关资源
    最近更新 更多