對gcc一些優化項目的具體說明

  1. 轉載出處:http://blog.csdn.net/gatieme/article/details/48898261
  2.                     http://blog.chinaunix.net/uid-14163325-id-189617.html

  3. GCC編譯器優化選項介紹:

GCC編譯器在目前是不是用最多的編譯器也相去不遠,尤其在嵌入式領域很多編譯器都是基於GCCcross gcc版本。畢竟功能成熟而且有開放的源代碼。

這裏只介紹優化編譯的參數

-O用來開啓優化編譯選項。

-O0:默認模式,不做任何優化。

-O1:優化。該模式下對於一個大的函數或功能會花費更多的時間和內存。

-fdefer-pop 推遲推出函數調用的參數,對於那些需要在函數調用後必須取出(pop)函數參數的機器而言,打開該項編譯器將把函數調用的參數壓入棧,等必要時幾個函數調用參數一起取出(pop)。這將節省處理時間。
-fdelayed-branch 如果對目標機支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令後面的指令空隙.
-fguess-branch-probability 使用啓發式算法預測分之指令,增加指令的命中率,提升運行效果。
-fcprop-registers 使用寄存器之間copy-propagation傳值,因爲在函數中把寄存器分配給變量, 所以編譯器執行第二次檢查以便減少調度依賴性(兩個段要求使用相同的寄存器)並且刪除不必要的寄存器複製操作
-floop-optimize 通過優化如何生成彙編語言中的循環, 編譯器可以在很大程序上提高應用程序的性能。 通常, 程序由很多大型且複雜的循環構成。 通過刪除在循環內沒有改變值的變量賦值操作, 可以減少循環內執行指令的數量, 在很大程度上提高性能。 此外優化那些確定何時離開循環的條件分支, 以便減少分支的影響
-fif-conversion if-then語句應該是應用程序中僅次於循環的最消耗時間的部分,簡單的if-then語句可能在最終的彙編語言代碼中產生衆多的條件分支通過減少或者刪除條件分支, 以及使用條件傳送 設置標誌和使用運算技巧來替換他們, 編譯器可以減少if-then語句中花費的時間量。
-fif-conversion2 這種技術結合更加高級的數學特性, 減少實現if-then語句所需的條件分支。
該模式下在不影響調試的狀況下還會打開‘-fomit-frame-pointer優化項。 
同時該模式不會爲Ada編譯器打開‘-ftree-sra’優化項,如需要則請使用命令參數輸入‘-ftree-sra’進行優化。

-O2


進一步優化.GCC執行幾乎所有支持的操作但不包括空間和速度之間權衡的優化。 
-O2優化等級下,並不執行循環展開和函數“內聯”優化操作。 
與-O1比較該優化-O2將會花費更多的編譯時間當然也會生成性能更好的代碼。

還要注意-fgcse下關於請求-O2優化等級的用於計算goto的程序。

-O3


-O3:更進一步優化。-O3打開-O2指定的所有優化操作並且打開:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-attribute" style="box-sizing: border-box;">-finline</span><span class="hljs-attribute" style="box-sizing: border-box;">-functions</span>
<span class="hljs-attribute" style="box-sizing: border-box;">-funswitch</span><span class="hljs-attribute" style="box-sizing: border-box;">-loops</span>
<span class="hljs-attribute" style="box-sizing: border-box;">-fgcse</span><span class="hljs-attribute" style="box-sizing: border-box;">-after</span><span class="hljs-attribute" style="box-sizing: border-box;">-reload</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; opacity: 0; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

優化項-O3

-Os:針對程序空間大小優化(多用於嵌入式系統)。 
-Os使能-O2中除去會增加程序空間的所有優化參數。同時-Os還會執行更加優化程序空間的選項

-Os:針對程序空間大小優化(多用於嵌入式系統)。-Os使能-O2中除去會增加程序空間的所有優化參數。同時-Os還會執行更加優化程序空間的選項。

      -Os會關閉以下優化選項:

      -falign-functions

   -falign-jumps

   -falign-loops

   -falign-labels

   -freorder-blocks

   -freorder-blocks-and-partition

   -fprefetch-loop-arrays

   -ftree-vect-loop-version 







發佈了28 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章