C++性能:for循环与while循环的比较

15

一般来说(或者从您的经验来看),for循环和while循环在性能上有区别吗?

如果它们是双/三重循环,情况会怎样?

循环变量是否会影响g++或Intel编译器中向量化(SSE)的性能?

谢谢


我很高兴你只是暂时性的瘫痪。我则是永久性的,这让我有点叛逆和怪僻。我不仅超脱于常规,而且无法被框架所限制。无论如何,如果像我一样进行严肃的优化,你会意识到这些东西只在性能调优的最后阶段才起到作用。祝你学业顺利。 - Mike Dunlavey
@Mike 谢谢。很遗憾听到你的消息。可悲的是,我们经常把许多事情视为理所当然,直到失去它们才意识到它们的重要性 :-( - Anycorn
6个回答

15

这里有一份关于该主题的不错的论文,点击这里查看。


1
我认为这段话很好地概括了一切:“优化很重要。但通常来说,可读性更重要。”在迭代方面,我倾向于使用for循环,因为它清楚地表明了您的循环变量在哪里被初始化和递增或递减。 - johnsyweb

10
任何聪明的编译器都不会真正显示它们之间的区别。无论如何,for循环只是一种特定形式的while循环的语法糖。

2

VS2015,Intel Xeon CPU

long long n = 1000000000;
int *v = new int[n];
int *v1 = new int[2*n];

start = clock();
for (long long i = 0, j=0; i < n; i++, j+=2)
    v[i] = v1[j];
end = clock();
std::cout << "for1 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;

p = v; pe = p + n; p1 = v1;
start = clock();
while (p < pe)
{
    *p++ = *p1;
    p1 += 2;
}
end = clock();
std::cout << "while3 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;

for1 - CPU时间 = 4.055

while3 - CPU时间 = 1.271


1

通过查看反汇编代码,这是很容易确定的。对于大多数循环来说,如果你做相同的工作,它们将是相同的。

int i = 0;
while (i < 10)
   ++i;

等同于

for (int i = 0; i < 10; ++i)
   ;

关于嵌套,它真的取决于您如何配置,但相同的设置应该产生相同的代码。

1

应该没有差别,但是请检查一下,因为我见过非常糟糕的旧版本GCC在ARM/Thumb代码之间创建不同的代码。其中一个优化了减法后比较以设置零标志位,而另一个则没有。非常糟糕。

再次嵌套应该没有影响。对于SSE/向量化等内容不确定,但我也不希望有任何差别。


0

这应该是可以忽略不计的。一个优化编译器应该使这种区别不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接