關於最優無限迴圈的考證

2021-12-29 20:59:50 字數 1763 閱讀 3891

昨天在乙個論壇裡看到乙個帖子,是關於無限迴圈的選擇問題,之前也看到過很多次說空for比while(1)效率高的論述,只是之前一直沒有功夫去考證。

話不多說,直入正題。

/* *\brief 示例一:空for  

*/ int main() 

return 0; } 

/*  *\brief 示例二:while(1)  

*/ int main() 

return 0; 

}   借用曾經看到的某論壇大師逢帖必發的一句話「不要迷信語言,要迷信編譯器」,撇去我對此人的偏見,對於這句話我還是比較認同的,畢竟自己寫的**最終是由你用的編譯器來編譯並連線成的,語言只是你和它打交道的中介,至於最終怎麼解釋執行,完全是它有最終解釋權。

有點偏題,直接上編譯器生成的彙編碼(注,此處編譯器及版本為:g++ (gcc) 4.4.6 20120305)

400554:   55                      push   %rbp   

400555:   48 89 e5              mov   %rsp,%rbp   

400558:   eb fe                  jmp    400558   

40055a:   90                      nop    

40055b:   90                      nop    

40055c:   90                      nop    

40055d:   90                      nop    

40055e:   90                      nop    

40055f:   90                      nop

兩者生成的彙編**一致,就不多貼乙份了。

事實證明,兩種無限迴圈寫法最終執行效率一樣,但是為什麼這麼多人說空for要比while(1)效率高呢?這其中還不乏一些很大的知名開源團隊。出於科學求證的態度我又測試了老的gcc版本(g++ (gcc) 3.2.4),證明和上面大體是一樣的。但是當我用vs2010和vc6.0測試時區別就出來了。

結果如下:

for(;;) 的反彙編:  

int main()

0041136e  jmp         main+1eh (41136eh)  

return 0;

00411370  xor         eax,eax  } 

while(1)的反彙編: 

int main() 

00411377  jmp         main+1eh (41136eh)       

return 0; 

00411379  xor         eax,eax  

}   顯而易見,vs平台下for(;;)生成的彙編指令少,並且不占用暫存器,沒有多餘的判斷和跳轉,比while (1)效能要好。

c++標準僅僅是一些規則,而編譯器才是最終規則的實現者,對於很多細節規則並沒有限定,這也要求我們盡量明確寫出與編譯器實現差異無關的**,就如char的實現是按照signed還是unsigned等等,這些標準沒有具體說明,各個編譯器廠商自然會有各自的實現方法,很多時候我們在乙個平台習慣的東西,換到另乙個平台就不一定湊效,這時候就需要我們知道編譯器具體實現的過程,或者只需要看一下實現的結果。

正如那句「不存在沒有bug的程式,只存在暫時未發現bug的程式」一樣,程式設計師的世界裡,「沒有最好,只有更好」 也是至理名言       ---peakflys

關於php迭代迴圈(無限分類)

看了四年之前寫的關於迭代迴圈的一片文章,已經完全看不懂了,不是邏輯難,而是沒有注釋,格式不規範,各種不細心,而且沒有思路講解,讓人一頭霧水。好的介紹是什麼?讓人看注釋就能明白你要幹什麼,甚至都不用看 先說思路吧 這是乙個關於分類的方法,無限分類。也就是說不知道有多少層關係,比如家居 廚房用具 炒鍋 ...

關於java讀寫速度的考證

bufferedreader br new bufferedreader new filereader args 0 bufferedwriter bw new bufferedwriter new filewriter args 1 string line while line br.readli...

python的遍歷迴圈與無限迴圈

迴圈結構 遍歷迴圈 for 迴圈變數 in 遍歷結構 語句塊 由保留字for和in組成,完整遍歷所有元素後結束 每次迴圈,所獲得元素放入迴圈變數,並執行一次語句塊 計數迴圈 n次 for i in range n 語句塊 0 n 1 for i in range m,n,k i由m開始,到n 1,並...