在主题中,我在学校里学到了,因为速度更快,但有人告诉我,虽然速度更快...... 我必须优化程序,我想写'while',而不是'for',但......它会不会慢? 例如:
for (int i=0; i<x; i++)
{
cout<<"dcfvgbh"<<endl;
}
我会写:
i=0;
while (i<x)
{
cout<<"dcfvgbh"<<endl;
i++;
}
答案 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
循环不是一种既定的优化技术。
您的示例在性能上都是相同的,但作为练习,您可以让他们为您自己确认。