keil優化等級說明 keil code optimization


其中

0級(Constan folding)的優化包括:

a、常數折疊:只要有可能,編譯器就執行將表達式化為常數數字的計算,其中包括運行地址的計算。

b、 簡單訪問優化:對8051系統的內部數據和位地址進行訪問優化。

c、 跳轉優化:編譯器總是將跳轉延至最終目標上,因此跳轉到跳轉之間的命令被刪除。

特點:最少的優化,可以最大程度上配合產生代碼調試信息,可以在任何代碼行打斷點,特別是死代碼處。

1級(Dead code elimination)的優化包括:

a、 死碼消除:無用的代碼段被消除。

b、 跳轉否決:根據一個測試回溯,條件跳轉被仔細檢查,以決定是否能夠簡化或刪除。

特點:有限的優化,去除無用的inline和無用的static函數、死代碼消除等,在影響到調試信息的地方均不進行優化。在適當的代碼體積和充分的調試之間平衡,代碼編寫階段最常用的優化等級。

2級(Data overlaying)的優化包括:

a、數據覆蓋:適於靜態覆蓋的數據和位段被鑒別並標記出來。連接定位器BL51通過對全局數據流的分析,選擇可靜態覆蓋的段。 

特點:高度優化,調試信息不友好,有可能會修改代碼和函數調用執行流程,自動對函數進行內聯等。

3級(Peephole optimization)的優化包括:

a、“窺孔”優化:將冗余的MOV命令去掉,包括不必要的從存儲器裝入對象及裝入常數的操作。另外如果能節省存儲空間或者程序執行時間,復雜操作將由簡單操作所代替。

特點:最大程度優化,產生極少量的調試信息。會進行更多代碼優化,例如循環展開,更激進的函數內聯等。

另外,可以通過單獨設置 --loop_optimization_level=option 來控制循環展開的優化等級。

4級(Register variables)的優化包括:

a、寄存器變量:使自動變量和函數參數盡可能位於工作寄存器中,只要有可能,將不為這些變量保留數據存儲器空間。

b、擴展訪問優化:來自IDATA、XDATA、PDATA和CODE區域的變量直接包含在操作之中,因此大多數時候沒有必要將其裝入中間寄存器。

c、局部公共子式消除:如果表達式中有一個重復執行的計算,第一次計算的結果被保存,只要有可能,將被用作后續的計算,因此可從代碼中消除繁雜的計算。

d、CASE/SWITCH語句優化:將CASE/SWITCH語句作為跳轉表或跳轉串優化。

5級(Common subexpression elimination)的優化包括:

a、全局公共子式消除:只要有可能,函數內部相同的子表達式只計算一次。中間結果存入一個寄存器以代替新的計算。

b、簡單循環優化:以常量占據一段內存的循環再運行時被優化。

6級(Loop rotation)的優化包括:

a、回路循環:如果程序代碼能更快更有效地執行,程序回路將進行循環。

7級(Extended Index Access optimizing)的優化包括:

a、擴展入口優化:在適合時對寄存器變量使用DPTR數據指針,指針和數組訪問被優化以減小程序代碼和提高執行速度。

8級(Reuse Common Entry Code)的優化包括:

a、公共尾部合並:對同一個函數有多處調用時,一些設置代碼可被重復使用,從而減小程序代碼長度

9級(Common Block Subroutines)的優化包括:

a、公共子程序塊:檢測重復使用的指令序列,並將它們轉換為子程序。C51甚至會重新安排代碼以獲得更多的重復使用指令序列。

優化級別並非越高越好,應該根據具體要求適當選擇。
在debug時盡量保證優化等級在0,在出貨時盡量保證等級在1,既不會出現問題,生成的代碼也小。
盡量不要用最高優先級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM