iOS 启动优化(二)-二进制重排篇

启动优化(一)-理论篇
启动优化(二)-二进制重排篇
启动优化(三)-编译期插桩篇
启动优化(四)-生成 Order File

二进制重排的效果

把所有启动需要使用到的符号全部放在前面的页码,从而减少Page Fault的次数,最后达到减少启动时消耗的时间。

能减少Page Fault次数的原因:
把启动阶段所需要的符号都挤放在最前面的同一个/几个page,这样在启动时候所需要加载的page的个数减少了,从而达到减少Page Fault次数。

重排目的

二进制重排就是为了减少启动时的缺页异常Page Fault从而减少启动时间(相关概念请看理论篇)

二进制重排前.png

二进制重排后.png

查看 Page Fault

打开Instruments: 快捷键 command+i


打开Instruments.png
选择System Trace.png
启动应用并检测.png
启动完成后停止.png
查看输出结果.png

当代码多起来的话,Page Fault的数量和加载耗时都会随着代码增加而增加。并且双击还能看到Page Fault堆栈

二进制重排可以很好优化这个问题,其中心思想是重新排列 方法符号的顺序, 使启动的相关方法排在最前面从而减少启动Page Fault的数量。

我们先来看看原来的符号顺序,这需要用到 链接映射文件 Link Map File

Link Map File 里可以看到方法符号的排序。知道了原来的符号排序,开发者怎么去设置自己想要的顺序呢?

order_file

Xcode提供了排列符号的设置给开发者,设置 order_file 即可。苹果也一直身体力行,objc 源码就采用了二进制重排优化。

objc源码 下载好,把源码根目录的libobjc.order复制到根目录改名为link.order文件,这里面就是方法符号的排序

生成link.order的文件.png

Target -> Build Setting -> Linking -> Order File 设置 order file 的路径: $(SRCROOT)/link.order

配置link.order路径.png
编写order_file

不知道怎么编写order?我们可以参照 objc源码 里的order编写

image.png
objc源码中的order编写.png
打开order.png

Link Map File 现实原来是先加载-[AppDelegate application:didFinishLaunchingWithOptions:] 后加载 -[ViewController viewDidLoad]

Link Map File的Symbols 部分.png

编写一下link.order

编写link.order.png

然后command+shift+K,再command+B重新编译一下,再查看一下 Link Map File,顺序已经换过来了

image.png

手动写入容易出错,比如手填两个不存在的方法,也一样编译通过,并且Link Map File并不会添加这两个不存在错误的方法

image.png
自动生成order_file

全手写一定是不可取的,想实现自动化就要解决下列问题:
1.保证不遗漏方法
2.保证方法符号正确
3.保证方法符号顺序正确

解决方案可见抖音团队分享
使用的是 静态扫描+运行时trace的方案, 能够覆盖到80%~90%的符号。但是上述的方法也存在性能瓶颈
1.initialize hook不到
2.部分block hook不到
3.C++通过寄存器的间接函数调用静态扫描不出来

解决以上问题:编译期插桩

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容