2010-05-21 41 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