我被告知while循環比for循環更有效。 (c/C++) 這似乎很合理,但我想找到一種方法來證明或反駁它。while循環比循環更有效
我已經嘗試了三次使用類似代碼片段的測試。每個包含只有出現for或while循環具有相同的輸出:
- 編譯時間 - 大致相同
- 行時間 - 相同
- 編譯到Intel彙編代碼和比較 - 相同數量的行和幾乎相同的代碼
我是否應該嘗試其他方法,或者任何人都可以確認一種方法?
我被告知while循環比for循環更有效。 (c/C++) 這似乎很合理,但我想找到一種方法來證明或反駁它。while循環比循環更有效
我已經嘗試了三次使用類似代碼片段的測試。每個包含只有出現for或while循環具有相同的輸出:
我是否應該嘗試其他方法,或者任何人都可以確認一種方法?
所有環路遵循相同的模板:
{
// 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循環跳過第一個條件檢查,並作爲練習留給讀者。 :)
當然,LLVM會將所有類型的循環轉換爲一致的形式(當然,儘可能)。因此,只要您具有相同的功能,如果使用for
,while
,do-while
或goto
來形成循環,如果它具有相同的初始化,退出條件以及更新語句和正文,則無關緊要,它將生成完全相同的機器碼。
如果編譯器在優化過程中足夠早地完成(編譯器仍然理解實際正在寫入的內容),那麼在編譯器中這並不難。這種「使所有循環相等」的目的是,你只需要一種方法來優化循環,而不是一個用於while循環,一個用於循環,一個用於do-while循環,另一個用於「任何其他循環」。
這並不是所有編譯器都能保證的,但我知道gcc/g ++也會生成幾乎相同的代碼,無論你使用什麼循環結構,並且從我見過的微軟也都這樣做。
C和C++編譯器實際上將高級C或C++代碼轉換爲彙編代碼,並且在彙編中我們沒有while
或for
循環。我們只能檢查一個條件並跳轉到另一個位置。
因此,for
或while
循環的性能在很大程度上取決於編譯器對代碼的優化程度。
這是代碼優化好紙:
http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf。
它們是一樣的。唯一的區別是邏輯操作順序和相應的可讀性。 – i486
誰告訴你 - 不要再聽那個人。 –
可能的重複https://stackoverflow.com/questions/3629174/which-loop-is-faster-while-or-for – oleksii