編譯器如何代碼優化

編譯器代碼優化

  • 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優化

優化的訣竅

  • 優化累加方法
  • 優化變量
    儘量使用局部變量,局部變量可以被優化使用立即數,可以節省全局變量被加載到內存的時間
  • 優化循環
  • 優化條件分支
  • 優化子表達式
    cse( common subexpression elimination)
    編譯器會分析整個彙編代碼,如果一個表達式被多次用到,會只計算一次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章