2010-05-21 45 views
11

一般来说(或根据您的经验),for循环和while循环在性能上有差异吗?C++性能,与之相比

如果双重/三重嵌套会怎么样?

在g ++或Intel编译器中,矢量化(SSE)是否受循环变体影响?

谢谢

+0

我很高兴你只是暂时削弱。我是永久的,我认为这让我有点逆转。我不仅是开箱即用的,我无法在箱子中取得*。无论如何,如果您在尝试展示如何进行严肃的优化时,您可能会意识到,只有在性能调优的最后阶段,这样的事情才会有所作为。祝你学习好。 – 2010-05-21 13:12:04

+0

@Mike谢谢。很抱歉听到你的消息。可悲的是,一个人需要许多事情是理所当然的,然后意识到他们失去了多少重要性:-( – Anycorn 2010-05-25 02:39:57

回答

13

Here是一个很好的论文。

+1

我认为这段文字总结得很漂亮:“*优化==重要但经常:可读代码==更多很重要。*“ 我倾向于循环迭代,因为它清楚了你的循环变量被初始化和递增或递减的地方。 – Johnsyweb 2010-05-21 02:44:52

9

任何智能编译器都不会真正显示它们之间的区别。 A for循环实际上只是语法糖对于某种形式的while循环,反正。

1

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

1

这是通过查看拆卸容易确定的事情。对于大多数循环,假设你做同样的工作,它们将是相同的。

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

相同

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

至于嵌套,这真的取决于你如何配置它,但相同的设置应产生相同的代码。

1

应该是零差异,但请检查,因为我已经看到真正蹩脚的旧版GCC在两者之间创建不同的代码ARM/Thumb代码。在减去一个比较之后优化一个比较以设置零标志,而另一个则不是。非常跛脚。

再次嵌套应该没有区别。不确定SSE /矢量化的东西,但我希望没有什么区别。

0

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