1.閉包記錄分配:若逃逸分析能識別哪些閉包記錄在創(chuàng)建它們的函數(shù)中是出口不活躍的,則這些閉包記錄可分配在棧幀中(不再是堆中)
2.內(nèi)聯(lián)擴展:由于小函數(shù)較多,因此內(nèi)聯(lián)可以免去調(diào)用開銷而提高性能,對于遞歸函數(shù),需先用循環(huán)前置頭轉(zhuǎn)換再內(nèi)聯(lián),如果是尾遞歸函數(shù),可先使用尾調(diào)用優(yōu)化刪除遞歸。如果一個函數(shù)的所有調(diào)用都被內(nèi)聯(lián)擴展,并且該函數(shù)沒有作為參數(shù)傳遞或其它方式被引用,那么可以刪除這個函數(shù)本身即函數(shù)定義。內(nèi)聯(lián)擴展可以繼續(xù)作用于擴展后的函數(shù)體,只要存在函數(shù)調(diào)用,這也叫層疊式內(nèi)聯(lián)
3.循環(huán)不變量參數(shù)外提:遞歸函數(shù)經(jīng)過循環(huán)前置頭轉(zhuǎn)換后,若每次遞歸調(diào)用頭函數(shù),傳入的某些參數(shù)值總不變,則可以將它們從函數(shù)參數(shù)中刪除,函數(shù)體中的每次使用出現(xiàn)用序曲函數(shù)對應(yīng)的參數(shù)名替換
4.解開嵌套的let:將嵌套的多層let中的代碼合并為一個let中的代碼,in中的代碼不變
5.避免代碼膨脹:由于內(nèi)聯(lián)復(fù)制函數(shù)體,通常使程序體積變大,且層疊式內(nèi)聯(lián)可無限擴展下去,因此為避免代碼膨脹,有如下啟發(fā)式策略對內(nèi)聯(lián)進行控制
a) 只內(nèi)聯(lián)執(zhí)行很頻繁的函數(shù)調(diào)用,可根據(jù)靜態(tài)估計比如循環(huán)嵌套深度、迭代次數(shù),或根據(jù)執(zhí)行剖面分析反饋,計算函數(shù)的執(zhí)行頻率
b) 內(nèi)聯(lián)很小的函數(shù),其函數(shù)體不會比直接調(diào)用多出較多指令
c) 內(nèi)聯(lián)只調(diào)用一次的函數(shù),然后刪除原來的函數(shù)定義
posted on 2023-09-07 06:47
春秋十二月 閱讀(63)
評論(0) 編輯 收藏 引用 所屬分類:
Compiler