編譯器常用優化方法
常量傳播
在編譯優化時, 能夠將計算出結果的變數直接替換為常量。

image.png
編譯器在進行編譯的時候,將a直接由1替換。因此優化後的程式碼為:

image.png
常量摺疊
在編譯優化時,多個變數進行計算時,而且能夠直接計算出結果,那麼變數將有常量直接替換。

image.png
編譯器在進行編譯時,將a直接由1替換,因此優化後的程式碼:

image.png
複寫傳播
兩個相同的變數可以用一個代替。

image.png
編譯器在進行編譯的時候,發現y和x相等,因此用x來代替y,優化後的程式碼如下:

image.png
公共子表式消除
如果一個表示式E已經計算過了,並且從先前的計算到現在的E中的變數都沒有發生變化,那麼E的此次出現就成為了公共子表示式。

image.png
經過優化之後的程式碼可能如下:

image.png
無用程式碼消除
永遠不能被執行到的程式碼或者沒有任何意義的程式碼會被清除掉。

image.png
因此優化過後的程式碼如下:

image.png
陣列範圍檢查消除
陣列邊界檢查不是必須在執行期間一次不漏的檢查,而是可以協商的。如果及時編譯器能根據資料流分析出變數的取值範圍在[0,max_length]之間,那麼在迴圈期間就可以把陣列的上下邊界檢查消除。
方法內聯
編譯器最終要的優化手段,可減少方法呼叫的成本,並未其他優化做基礎。
逃逸分析
分析物件動態作用域,一旦確定物件不會發生方法逃逸和執行緒逃逸,就可以對這個變數進行高效的優化,比如棧上分配、同步消除、標量替換等。