是否比快?

时间:2014-01-02 22:30:04

标签: c++ performance

在主题中,我在学校里学到了,因为速度更快,但有人告诉我,虽然速度更快...... 我必须优化程序,我想写'while',而不是'for',但......它会不会慢? 例如:

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

我会写:

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

5 个答案:

答案 0 :(得分:10)

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

  

for声明
  for(for-init-statement condition opt ; expression opt )语句
  相当于

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

不,不是。

速度不快。

答案 3 :(得分:3)

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

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

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

因为一些优化编译器将执行loop unrolling。这意味着他们不会对每次通过循环执行测试,因为他们可以“看到”只是在循环内做24次(或4次块中的6次等)将更有效。当循环内的东西非常小时(例如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语句形成的循环   展开。展开使用其他控件构造形成的循环是   因为循环计数不明显所以很困难。

答案 4 :(得分:1)

据我所知,为for循环换出while循环不是一种既定的优化技术。

您的示例在性能上都是相同的,但作为练习,您可以让他们为您自己确认。