啟動優化(一)-理論篇
啟動優化(二)-二進制重排篇
啟動優化(三)-編譯期插樁篇
啟動優化(四)-生成 Order File
二進制重排的效果
把所有啟動需要使用到的符號全部放在前面的頁碼,從而減少Page Fault
的次數,最后達到減少啟動時消耗的時間。
能減少Page Fault
次數的原因:
把啟動階段所需要的符號都擠放在最前面的同一個/幾個page
,這樣在啟動時候所需要加載的page
的個數減少了,從而達到減少Page Fault
次數。
重排目的
二進制重排就是為了減少啟動時的缺頁異常Page Fault
從而減少啟動時間(相關概念請看理論篇)
查看 Page Fault
打開Instruments: 快捷鍵 command+i
當代碼多起來的話,Page Fault
的數量和加載耗時都會隨著代碼增加而增加。并且雙擊還能看到Page Fault堆棧
二進制重排
可以很好優化這個問題,其中心思想是重新排列 方法符號的順序, 使啟動的相關方法排在最前面從而減少啟動Page Fault的數量。
我們先來看看原來的符號順序,這需要用到 鏈接映射文件 Link Map File
。
Link Map File 里可以看到方法符號的排序。知道了原來的符號排序,開發者怎么去設置自己想要的順序呢?
order_file
Xcode提供了排列符號的設置給開發者,設置 order_file
即可。蘋果也一直身體力行,objc
源碼就采用了二進制重排優化。
把 objc源碼 下載好,把源碼根目錄的libobjc.order
復制到根目錄改名為link.order
文件,這里面就是方法符號的排序
Target
-> Build Setting
-> Linking
-> Order File
設置 order file 的路徑: $(SRCROOT)/link.order
編寫order_file
不知道怎么編寫order?我們可以參照 objc源碼 里的order編寫
Link Map File
現實原來是先加載-[AppDelegate application:didFinishLaunchingWithOptions:]
后加載 -[ViewController viewDidLoad]
編寫一下link.order
然后command+shift+K,再command+B重新編譯一下,再查看一下 Link Map File
,順序已經換過來了
手動寫入容易出錯,比如手填兩個不存在的方法,也一樣編譯通過,并且Link Map File并不會添加這兩個不存在錯誤的方法
自動生成order_file
全手寫一定是不可取的,想實現自動化就要解決下列問題:
1.保證不遺漏方法
2.保證方法符號正確
3.保證方法符號順序正確
解決方案可見抖音團隊分享
使用的是 靜態掃描+運行時trace的方案, 能夠覆蓋到80%~90%的符號。但是上述的方法也存在性能瓶頸
:
1.initialize hook不到
2.部分block hook不到
3.C++通過寄存器的間接函數調用靜態掃描不出來
解決以上問題:編譯期插樁