編譯器代碼優化
- GNU編譯器的優化等級
- -O 基本的優化
- -fdefer-pop 默認方法返回時,會將輸入參數出棧,這個優化可以將輸入參數在棧上累計,並通過一個命令一次清空所有棧上數據
- -fmerge-constant 合併程序中相同的constant變量
- -fthread-jumps 使得編譯器分析代碼,可以跳過不必要的分支,直接到達最終的目的分支
- -floop-optimize 優化循環中的變量等信息
- -fif-conversion 優化if分支
- -fif-conversion2 採用高級數學優化分支
- -fdelay-branch 通過重排指令的方式,最大程度的利用指令緩存
- -fguess-branch-probability 通過分支預測重排指令,可能導致兩次編譯的結果不一致,不建議使用
- -fcprop-registers 編譯器檢查變量的寄存器,減少調度依賴和不必要的寄存器拷貝
- -O2 比較高級的優化
- -fforce-mem 強制所有存儲在內存中的變量在使用前被存儲在寄存器中
- -foptimize-sibling-calls 主要用於處理遞歸方法
- -fstrength-reduce 用於優化循環中的迭代變量
- -fgcse 用於優化生成彙編代碼中的公共代碼,減少冗餘代碼段
- -fcse-follow-jumps 通過分析公共子程序消除不能到達的分支
- -frerun-cse-after-loop 是的循環中被優化的代碼進一步優化
- -fdelete-null-pointer-checkers 掃描生成的彙編代碼以檢查空指針代碼
- -fexpensive-optimizations 從編譯時的角度進行優化
- -fregmove 編譯器嘗試重新分配MOV指令中的寄存器,以便最大程度的使用寄存器綁定的數量
- -fschedule-insns 編譯器試圖重排指令以消除處理器等待數據
- -fsched-interblock 是的編譯器可以跨塊調度指令
- -fcaller-saves 指示編譯器在不需要保存和重載的情況下替換寄存器的值
- -fpeephole2 啓動所有機器級別的優化
- -freorder-blocks 重排指令塊以優化分支和本地代碼
- -fstrict-aliasing 執行高級語言的嚴格變量規則,使得不同變量的數據使用不同的存儲空間
- -funit-at-a-time 是的機器在閱讀完所有的機器代碼後執行優化,需要大量的內存
- -falign-function 是的方法開始在指定大小的對齊位置
- -falign-loops 是的循環開始在指定大小對齊的位置
- -fcrossjumping 將交叉跳轉代碼整合
- -O3 最高等級的優化
- -finline-functions 會將被調函數代碼整合到調用函數中
- -fweb 構建僞寄存器網絡保存變量
- -fgcse-after-reload 這種技術會執行二次gcse優化
- -O 基本的優化
優化的訣竅
- 優化累加方法
- 優化變量
儘量使用局部變量,局部變量可以被優化使用立即數,可以節省全局變量被加載到內存的時間 - 優化循環
- 優化條件分支
- 優化子表達式
cse( common subexpression elimination)
編譯器會分析整個彙編代碼,如果一個表達式被多次用到,會只計算一次。