C++ 性能,for 与 while
Posted
技术标签:
【中文标题】C++ 性能,for 与 while【英文标题】:C++ performance, for versus while 【发布时间】:2011-02-22 04:14:07 【问题描述】:总的来说(或根据您的经验),for 和 while 循环的性能是否存在差异?
如果它们是双重/三重嵌套怎么办?
g++ 或 Intel 编译器中的循环变体是否会影响矢量化 (SSE)?
谢谢
【问题讨论】:
我很高兴你只是暂时残废了。我是永久的,我认为这让我有点逆势。我不仅是开箱即用的,我也无法in。无论如何,如果您像我尝试展示的那样进行认真的优化,您可能会意识到这样的事情只有在性能调整的最后阶段才会有所作为。祝你学业顺利。 @Mike 谢谢。很抱歉听到你的消息。可悲的是,一个人认为很多事情是理所当然的,然后一旦失去它们就会意识到它们的重要性:-( 【参考方案1】:Here 是一篇很好的论文。
【讨论】:
我认为这一段很好地总结了这一切:“优化 == 重要。但通常:可读代码 == 更重要。”我倾向于使用for
循环进行迭代,因为很清楚您的循环变量在哪里被初始化和递增或递减。【参考方案2】:
任何智能编译器都不会真正显示它们之间的区别。无论如何,for
循环实际上只是某种形式的 while
循环的语法糖。
【讨论】:
【参考方案3】:这很容易通过查看拆卸来确定。对于大多数循环,假设您执行相同的工作,它们将是相同的。
int i = 0;
while (i < 10)
++i;
与
相同for (int i = 0; i < 10; ++i)
;
至于嵌套,它实际上取决于您如何配置它,但相同的设置应该产生相同的代码。
【讨论】:
【参考方案4】:应该是零差异,但请检查一下,因为我看到的确实很糟糕,旧版本的 GCC 在两者之间创建了不同的代码 ARM/Thumb 代码。一个优化了减法后的比较以设置零标志,而另一个则没有。很蹩脚。
再次嵌套应该没有区别。不确定 SSE/矢量化的东西,但我再次希望没有区别。
【讨论】:
【参考方案5】:VS2015,英特尔至强 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
【讨论】:
【参考方案6】:应该可以忽略不计。优化编译器应该不存在这种区别。
【讨论】:
以上是关于C++ 性能,for 与 while的主要内容,如果未能解决你的问题,请参考以下文章