自編教材分享:第六章—程序編寫優(yōu)化(五)



語句級優(yōu)化
刪除冗余語句
在開發(fā)和修改程序時可能遺留有死代碼,死代碼是指程序在一個完整的執(zhí)行過程該段代碼并沒有得到任何的運行,也可能是一些聲明了但沒有用到的變量,此時可以將其刪除,避免程序在運行中進行不相關的運算行為,減少運行的時間。
優(yōu)化前代碼:
優(yōu)化后代碼:
代數(shù)變換
程序員在編寫程序時可能忽略了代數(shù)表達式也可以進一步優(yōu)化,達到簡化計算縮短運行時間的目的。此代碼中的計算語句可以進行簡化,原計算語句中含有乘法、加法和除法三種運算,而簡化后僅剩乘法運算。
優(yōu)化前代碼:
優(yōu)化后代碼:
去除相關性
標量擴展
語句中依賴關系的存在非常不利于進行語序調整、向量化等優(yōu)化方法的開展,且由于編譯器優(yōu)化的局限性,需要優(yōu)化人員在編寫程序時盡量消除依賴關系。
標量擴展是將循環(huán)中的標量引用用編譯器生成的臨時數(shù)組引用替換,可以有效地消除一些由內存單元的重用而導致的依賴。
優(yōu)化前代碼:
優(yōu)化后代碼:
標量重命名
此循環(huán)中語句S1到S4之間存在真依賴,S1到S3之間存在輸出依賴,這些語句間的依賴都是由于標量T引起的,此時可以通過引入兩個不同的變量代替現(xiàn)有的變量T來消除依賴。
優(yōu)化前代碼:
優(yōu)化后代碼:
數(shù)組重命名
數(shù)組的存儲單元有時被重用會導致不必要的反依賴和輸出依賴,此時可以使用數(shù)組重命名的方法來消除。
優(yōu)化前代碼:
優(yōu)化后代碼:
數(shù)組重命名需要增加和數(shù)組大小成比例的額外內存空間,因此數(shù)組重命名的安全性和有利性都比標量重命名復雜,這種代價可能會嚴重影響到程序的性能,因此在實施數(shù)組重命名時應該更加謹慎。
公共子表達式優(yōu)化
當程序中表達式含有兩個或者更多的相同子表達式,僅需要計算一次子表達式的值即可
優(yōu)化前代碼:
優(yōu)化后代碼:
分支語句優(yōu)化
合并判斷條件
當程序中的分支判斷條件是復雜表達式,優(yōu)化人員可以將其進行優(yōu)化
優(yōu)化前代碼:
優(yōu)化后代碼:
生成選擇指令
一些平臺支持選擇指令,選擇指令是一個三目運算指令,在某些情況下可以將分支指令用選擇指令進行替換,達到提升效率的目的。
優(yōu)化前代碼:
優(yōu)化后代碼:
運用條件編譯
由于宏條件在編譯時就已經(jīng)確定,編譯器可直接忽略不成立的分支,所以條件編譯是在編譯時判斷。而普通分支判別是在運行時判斷,故編譯后的代碼要長,效率也不如條件編譯。
優(yōu)化前代碼:
優(yōu)化后代碼:
移除分支語句
如果在程序設計時,編程人員能夠將各分支路徑的計算結果放到一張表中,并將分支條件轉化為表中值對應的索引,那么就可以將分支跳轉轉化為訪問表中元素,這是查表法移除分支的主要思想。
優(yōu)化前代碼:
優(yōu)化后代碼:
平衡分支判斷
C語言中的switch運算符是程序員經(jīng)常使用的一種語法,包含大量的分支,在一些程序中switch運算符可以含有數(shù)千個設置值,若直接實現(xiàn)這種需求的話,所得到的邏輯樹會特別高,以下面switch分支語句為例。
下圖為分支語句對應的判斷邏輯樹,該代碼所對應的優(yōu)化邏輯樹的高度為6,當a的值為10時需要6次判斷,可以通過平衡判斷分支的方法對分支語句進行優(yōu)化,優(yōu)化后邏輯判斷樹如右圖所示,當a的值為10時需要4次判斷,即平均僅需要4次比較操作就能完成判斷。


自編教材分享:第六章—程序編寫優(yōu)化(五)的評論 (共 條)
