2016-01-10 169 views
5

我被告知while循環比for循環更有效。 (c/C++) 這似乎很合理,但我想找到一種方法來證明或反駁它。while循環比循環更有效

我已經嘗試了三次使用類似代碼片段的測試。每個包含只有出現for或while循環具有相同的輸出:

  1. 編譯時間 - 大致相同
  2. 行時間 - 相同
  3. 編譯到Intel彙編代碼和比較 - 相同數量的行和幾乎相同的代碼

我是否應該嘗試其他方法,或者任何人都可以確認一種方法?

+9

它們是一樣的。唯一的區別是邏輯操作順序和相應的可讀性。 – i486

+14

誰告訴你 - 不要再聽那個人。 –

+0

可能的重複https://stackoverflow.com/questions/3629174/which-loop-is-faster-while-or-for – oleksii

回答

3

所有環路遵循相同的模板:

{ 
// Initialize 
LOOP: 
    if(!(/* Condition */)) { 
     goto END 
    } 

    // Loop body 

    // Loop increment/decrement 
    goto LOOP 
} 
END: 

爲此兩個環是相同的:

// A 
for(int i=0; i<10; i++) { 
    // Do stuff 
} 

// B 
int i=0; 
while(i < 10) { 
    // Do stuff 
    i++; 
} 

// Or even 
int i=0; 
while(true) { 
    if(!(i < 10)) { 
     break; 
    } 

    // Do stuff 
    i++; 
} 

兩者都轉換爲類似於:

{ 
int i=0; 
LOOP: 
    if(!(i < 10)) { 
     goto END 
    } 

    // Do stuff 

    i++; 
    goto LOOP 
} 
END: 

未使用/無法訪問的代碼將從最終的可執行文件/庫中刪除。

Do-while循環跳過第一個條件檢查,並作爲練習留給讀者。 :)

1

當然,LLVM會將所有類型的循環轉換爲一致的形式(當然,儘可能)。因此,只要您具有相同的功能,如果使用for,while,do-whilegoto來形成循環,如果它具有相同的初始化,退出條件以及更新語句和正文,則無關緊要,它將生成完全相同的機器碼。

如果編譯器在優化過程中足夠早地完成(編譯器仍然理解實際正在寫入的內容),那麼在編譯器中這並不難。這種「使所有循環相等」的目的是,你只需要一種方法來優化循環,而不是一個用於while循環,一個用於循環,一個用於do-while循環,另一個用於「任何其他循環」。

這並不是所有編譯器都能保證的,但我知道gcc/g ++也會生成幾乎相同的代碼,無論你使用什麼循環結構,並且從我見過的微軟也都這樣做。