iOS二进制重排优化(二)

本文通过实践展示了如何通过调整Xcode工程的CompileSources排序和使用OrderFile来实现二进制重排,以减少PageFaults,从而提高iOS应用的启动性能。作者详细描述了从建立工程、设置WriteLinkMapFile、分析LinkMap文件到创建order文件并验证效果的整个过程。
摘要由CSDN通过智能技术生成

本文首发于公众号 程序员华仔

前面一篇介绍了二进制重排的原理和基本操作步骤,本文就实践下,毕竟亲自动手才能印象深刻。

一 如何量化提高的性能

二进制重排方案能提高多少性能,网络上还给出一个计算方式:一次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一样的符号次序。

至此,实践过程全部完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员华仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值