1

在我的設計和分析 講座中,教師說for循環對於下面的示例算法,while循環將花費更少的時間。For循環vs While循環

1. for(int i=0;i<5;i++) 
    {  
2.  print(i);  
    } 

1. int i=0; 
2. while(i<5) 
    {  
3.  print(i);  
4.  i++;  
    } 

他說,編譯器將讀取的1.而5次第2行的4倍從而總時間5 + 4 = 9 但在while循環的情況下。編譯器將讀取1次,2次。 5次,4次4次,4次4次。因此總時間1 + 5 + 4 + 4 = 14時間 請告訴我這是正確的。循環比while循環更快嗎?

謝謝。

+0

一個編譯器設置爲opmizing的速度可能只是發出'print(i)'五次,並完全消除循環。在這兩種情況下。 – Joey 2012-02-17 10:58:14

+0

在現實世界中,我們關注代碼的可讀性,並根據它選擇「for」或「while」。編譯器會優化差異。或者現代機器上的差別很小,因此可以忽略不計。使用那個讓你的生活更輕鬆的,而不是電腦的「生活」。 – Bazzz 2012-02-17 10:59:58

+0

如果沒有設置優化,然後? – wali 2012-02-17 11:00:14

回答

6

至少與MSVC 16(VS 2010)的代碼是相當多的在這兩種情況下是相同的:

; Line 5 
    xor esi, esi 
[email protected]: 
; Line 6 
    push esi 
    push OFFSET [email protected][email protected][email protected] 
    call _printf 
    inc esi 
    add esp, 8 
    cmp esi, 5 
    jl SHORT [email protected] 

; Line 4 
    xor esi, esi 
[email protected]: 
; Line 6 
    push esi 
    push OFFSET [email protected][email protected][email protected] 
    call _printf 
; Line 7 
    inc esi 
    add esp, 8 
    cmp esi, 5 
    jl SHORT [email protected] 

代碼in my Subversion repository

+2

感謝*理智*。 (請注意,只有調試信息和標籤名稱不同) – 2012-02-17 12:13:46

2

在所有現代編譯器中,loop analysis是在較低級別的中間表示(即,當所有高級循環結構被擴展爲標號和跳轉時)完成的。對於編譯器來說,兩個循環是完全等價的

+0

我可以提供什麼邏輯原因或證明來與他爭論。 – wali 2012-02-17 11:17:45

+0

@wali,向他展示兩個版本的彙編輸出,給出這些幻燈片,在'gcc'或'llvm'(這是現代編譯器的典型代表)中顯示相關的轉換實現。 – 2012-02-17 11:22:25

2

我會通過對性能(提示:沒有區別,檢查產生的IR或組裝的證明),然而還有在語法維護兩個重要的區別。

語法

i所述變量的範圍是不同的。在for的情況下,i只能在for標頭機體內訪問,而在while的情況下,它在循環後可用。作爲一般規則,最好有更嚴格的範圍,更少的變量正在進行中的意味着編碼時不必擔心的上下文。

維護

for循環有分組的所有操作併攏迭代整齊的優勢,這樣他們就可以一次性檢查等檢查。

而且,存在引入continue語句時一個重要的不同:

for(int i = 0; i != 10; ++i) { 
    if (array[i] == nullptr) { continue; } 
    // act on it 
} 


int i = 0; 
while (i != 10) { 
    if (array[i] == nullptr) { continue; } 
    // act on it 
    ++i; 
} 

while情況下,引進continue創造了一個錯誤:無限循環,當計數器不再執行。

影響

for循環是更具可讀性和全能更好地爲定期迭代模式。更妙的是,在C++ 11的範圍內,對聲明:

for (Item const& item : collection) { 
} 

其中迭代完全由編譯器的照顧,所以你一定不要亂了! (它使for_each算法有些毫無意義......和形式開始撤退,我們可以希望老)

通過corrolary:while循環應在代碼審查保留不規則的迭代模式,這樣,他們將吸引優撫從未來的維護者通過突出顯示不規範的情況。