【问题标题】:Is while faster than for?while 比 for 快吗?
【发布时间】:2014-01-20 12:04:33
【问题描述】:

正如主题,我在学校了解到,循环 for 比循环 while 快,但有人告诉我 while 更快。

我必须优化程序,我想写while 而不是for,但我担心它会变慢?

例如我可以改变for循环:

for (int i=0; i<x; i++)
{
   cout<<"dcfvgbh"<<endl;
}

进入while循环:

i=0;
while (i<x)
{
    cout<<"dcfvgbh"<<endl;
    i++;
}

【问题讨论】:

  • 你可以计时并找出答案吗?
  • 如果这两个生成的程序集不相同,我会感到震惊。
  • 任何可以被问到的问题,被问到。
  • 优化的第一步是了解您正在编程的语言的名称。cout&lt;&lt; 不是 C。

标签: c++ performance loops for-loop while-loop


【解决方案1】:

该标准要求(§6.5.3/1):

for 声明
for (for-init-statement 条件opt; 表达式opt) 语句
相当于

{
    for-init-statement
    while ( condition ) {
        statement
        expression;
    }
}

因此,您不太可能看到它们之间有太大差异(即使执行时间不一定是标准中指定的等效性的一部分)。也列出了一些例外情况(名称范围,如果您执行continue,则在评估条件之前执行表达式)。后者至少在理论上会在某些情况下影响速度,但通常可能不足以引起注意或关心,除非您在循环中实际使用了continue,否则绝对不会。

【讨论】:

    【解决方案2】:

    出于所有意图和目的,for 只是写while 的一种奇特方式,因此这两种方式都没有性能优势。使用其中一个的主要原因是如何翻译意图,以便读者更好地理解循环实际在做什么。

    【讨论】:

    • 并非出于所有的意图和目的,continue 关键字的差异很小但有时很重要。
    • @hyde:你是说在for 中使用continue 可以不同于在while 中使用?
    • 要将使用continuefor 循环转换为while 循环,通常需要更改逻辑以不使用continuefor(i=0; i&lt;10; ++i) if (i&amp;1) continue; stuff(); if (i&amp;2) continue; stuff2(); }
    • @hyde: continue 只是goto 的一种写法。这两种方式有什么不同?
    • 选择whilefor 时,您的答案的中心点似乎是表达意图,所以您肯定会看到continue i> 在循环中表达意图。
    【解决方案3】:

    没有。

    不,不是。

    并没有更快。

    【讨论】:

    • @Mr.Smith 很遗憾你忘记了前导 No. 中的粗体字母
    • 这不是一个好的答案吗?它更快吗?不,不是,这是事实。
    【解决方案4】:

    cout 将占用此循环 99% 的时钟周期。小心微优化。无论如何,这两个将给出基本相同的代码。

    for 循环可以更快的唯一时间是当你有一个已知的终止条件时 - 例如

    for(ii = 0; ii < 24; ii++)
    

    因为一些优化编译器会执行loop unrolling。这意味着他们不会在每次通过循环时都执行测试,因为他们可以“看到”在循环内执行 24 次(或 6 次以 4 块为单位等)的效率会稍微高一点。当循环内的东西非常小时(例如jj += ii;),这样的优化使for循环比while(通常不做“展开”)快一点。

    否则 - 没有区别。

    更新应@zeroth的要求

    来源:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.47.9346&rep=rep1&type=pdf

    引用来源(我的重点):

    在源代码级别展开循环涉及识别 循环结构(例如,for、while、do-while 等),确定 循环计数,以确保它是一个计数循环,复制 循环体和展开循环的循环次数的调整。一种 也可以插入序言或尾声代码。使用这种方法, 很难展开使用 while 和 goto 形成的循环 语句,因为循环计数不明显。然而,除了 最简单的循环,这种方法既乏味又容易出错。

    另一种选择是自动展开循环。自动的 展开可以在源代码的早期进行,在未优化的后期进行 中间表示,或者很晚的优化 程序的表示。 如果在源代码级别完成, 那么通常只有使用 for 语句形成的计数循环是 展开。展开使用其他控制结构形成的循环是 困难,因为循环计数不明显。

    【讨论】:

    • 这很有趣,但我想知道更多关于为什么当 for 循环将被展开时 while 循环不展开,或者哪些编译器。
    【解决方案5】:

    据我所知,将 for 循环替换为 while 循环并不是一种成熟的优化技术。

    您的两个示例在性能上是相同的,但作为练习,您可以对它们进行计时以自己确认这一点。

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2011-01-29
      • 2017-11-29
      • 2016-04-15
      • 2011-02-06
      • 2015-10-30
      • 2016-08-07
      • 1970-01-01
      • 2016-01-17
      相关资源
      最近更新 更多