Fandom

圍紀實驗室

編譯器最佳化的技術

简体 | 繁體 | 简体 | 正體

1,554个页面
创建于此维基
添加新页面
条评论0 分享

編譯器最佳化(Compiler Optimization)是在將原始程式碼轉為可執行檔案的過程中,在不影響執行結果的前提下改變原始程式的內容以調整程式的特性。常見的最佳化有執行速度的最佳化、執行檔大小的最佳化、佔用記憶體的最佳化等等。本篇文章目前的示例都以Python程式語言為例。

迴圈最佳化编辑

  • 平行化
自動將前後獨立的迴圈進行平行化處理,使迴圈可以同時在數個不同的處理器上運作,以加快處理速度。
  • 邏輯順序變換
將原本在迴圈內部且與迴圈的執行結果無關的判斷式移至迴圈外。例如這樣的程式碼
for i in range(1,5):
    if a == b:
        print i
由於迴圈內的判斷式不會受到迴圈內容影響,故經過最佳化之後可以變成這樣
if a == b:
    for i in range(1,5):
        print i
  • 迴圈展開
將在編譯時期已知圈數的迴圈展開,減少迴圈的控制需要的額外時間以及減少目的碼中branch的數量,以使CPU的pipeline功能可以發揮得更好。
  • 迴圈變數簡化
若迴圈中用到的值都是迴圈變數的函數非而變數本身,改變迴圈變數運算的方法可以節省一些指令。
  • 迴圈融合
若相鄰的兩迴圈跑相同的次數且相依,則可以合併兩迴圈以減少迴圈控制需要的時間。如
for i in range(1,ndata):
    phones.append(data[i].phone)

for j in range(1,ndata):
    addresses.append(data[j].address)
就會自動被簡化成
for i in range(1,ndata):
    phones.append(data[i].phone)
    addresses.append(data[i].address)

目的碼最佳化编辑

  • 暫存器使用
把使用頻率最高的變數直接存放在暫存器中,以得到最高的存取效能。
  • 提出公因式
若產生出的代碼中有數個一模一樣的區塊,則提出成為小型的函式;此舉會增加執行的時間,但可以減少執行檔的大小。
  • 運算順序重置
將部份不相關的運算改變順序,以利提出公因式的進行。
  • 指令結合
現代CISC系的CPU都有許多不同的指令方式可以做同一件事,可以在不影響結果的前提下調整指令(instruction)的順序使數個指令可以被一個較高階的CPU指令取代。

運算式最佳化编辑

  • 重覆運算縮減
將一條運算式中重覆的部份集中,只運算一次。例如在
a = (c**6)+(15+(c**3))/2-(c**3)
當中,c的3次方只需要被計算一次。
  • 已知常數替代
把在編譯時期已經可以知道確切值的常數結合,避免在執行時期再次運算。例如
a = 5
b = a**2 + 639 - 199*a
便可以直接被替代成
a = 5
b = -331
  • 遞迴最佳化
遞迴所耗費的額外時間非常多,將可化成迴圈的遞迴化成迴圈

參考資料编辑

您使用了广告屏蔽软件!


Wikia通过广告运营为用户提供免费的服务。我们对用户通过嵌入广告屏蔽软件访问网站进行了使用调整。

如果您使用了广告屏蔽软件,将无法使用我们的服务。请您移除广告屏蔽软件,以确保页面正常加载。

查看其他Fandom

随机维基