本文首发于公众号 程序员华仔
前面一篇介绍了二进制重排的原理和基本操作步骤,本文就实践下,毕竟亲自动手才能印象深刻。
一 如何量化提高的性能
二进制重排方案能提高多少性能,网络上还给出一个计算方式:一次Page Fault,需要开销0.6-0.8ms。那么根据System Trace,知道了启动有多少个Page Fault,那就可以得到能提高多少优化空间了。这样作为实施者,就可以知道大概能提升多少优化空间。
二 实践
以下是实践具体步骤。
本实践的目的:
1.实践二进制重排步骤。
2.验证Compile Sources中文件的排序是否有影响符号位置。
3.验证代码行数是否会影响符号位置.
具体步骤:
1.建立了一个工程,新建了一个MyTestViewController文件。该文件有以下代码
@implementation MyTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)buttonClicked:(int)aIndex {
NSLog(@"test");
}
@end
2.设置Write Link Map File为YES,
同时查看了工程设置 Build Phases -> Compile Sources 里面的.m文件的排序次序。这就是网上说的,“ ld 的读取二进制文件顺序默认是按照 Compile Sources 里的顺序 ”
其中次序的排序在 后面的linkmap.txt文件中数字一一对应。不过实际工程是从2开始的。
3.经过设置Write Link Map File之后,直接编译工程,最后会生成.txt文件。
文件全名为:XXX-LinkMap-normal-x86_64.txt,
该文件的具体路径如下图:
4.打开txt文件,可以看到MyTestViewController文件的函数Compile Sources对应文件列表中最后。说明Compile Sources的排序是有一定关系的。
5.然后调整了Compile Sources中MyTestViewController文件位置(由5变成1)并且新增加了buttonFirst函数。变成如下格式:
@implementation MyTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)buttonFirst {
NSLog(@"First");
}
- (void)buttonClicked:(int)aIndex {
NSLog(@"test");
}
@end
结果txt文件函数的位置和数字都变动了。这里说明txt的函数位置与Compile Sources中文件排序和编写代码函数的行数都有关系。
6.新建立了一个order文件。如touch newFun.order。
在工程中设置Order File 路径,当前工程目录下 .\newFun.order
7.newFun.order文件重新调整
MyTestViewController的函数位置。具体如下。
-[MyTestViewController buttonFirst]
-[MyTestViewController buttonClicked:]
-[MyTestViewController viewDidLoad]
8.清空工程,重新编译。再来看txt文件。最终实现了想要的效果,和newFun.order一样的符号次序。
至此,实践过程全部完成了。