編譯-O 選項對性能提升作用

GCC -O 選項

         這個選項控制所有的優化等級。使用優化選項會使編譯過程耗費更多的時間,並且佔用更多的內存,尤其是在提高優化等級的時候。

-O設置一共有五種:-O0-O1-O2-O3-Os

讓我們來逐一考察各個優化等級:

  • -O0:這個等級(字母“O”後面跟個零)關閉所有優化選項,也是CFLAGS或CXXFLAGS中沒有設置-O等級時的默認等級。這樣就不會優化代碼,這通常不是我們想要的。
  • -O1:這是最基本的優化等級。編譯器會在不花費太多編譯時間的同時試圖生成更快更小的代碼。這些優化是非常基礎的,但一般這些任務肯定能順利完成。
  • -O2-O1的進階。這是推薦的優化等級,除非你有特殊的需求。-O2會比-O1啓用多一些標記。設置了-O2後,編譯器會試圖提高代碼性能而不會增大體積和大量佔用的編譯時間。
  • -O3:這是最高最危險的優化等級。用這個選項會延長編譯代碼的時間,並且在使用gcc4.x的系統裏不應全局啓用。自從3.x版本以來gcc的行爲已經有了極大地改變。在3.x,-O3生成的代碼也只是比-O2快一點點而已,而gcc4.x中還未必更快。用-O3來編譯所有的軟件包產生更大體積更耗內存的二進制文件,大大增加編譯失敗的機會或不可預知的程序行爲(包括錯誤)。這樣做將得不償失,記住過猶不及。gcc 4.x.中使用-O3是不推薦的
  • -Os:這個等級用來優化代碼尺寸。其中啓用了-O2中不會增加磁盤空間佔用的代碼生成選項。這對於磁盤空間極其緊張或者CPU緩存較小的機器非常有用。但也可能產生些許問題,因此軟件樹中的大部分ebuild都過濾掉這個等級的優化。使用-Os是不推薦的。

-O2是推薦的優化等級,也是多數程序使用的優化等級。以前一致以爲-O選項是錦上添花的東西,認爲一般只可以提升10%-20,不會對性能明顯的提升。最近測試一個程序,發現不加-O2選項的時候,進行一輪計算二百多ms,加了以後減少到三十多ms,感概編譯優化既然可以對性能由如此大的提升。另外曾經一個對於性能要求比較高的程序,我們曾經使用了O3選項,對於一些長尾查詢性能得到了較大提升,但鑑於上面提到的O3選項的風險,看來通過分析程序瓶頸或部署做性能提升也是必經之路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章