System Trace
signpost
现在我们在Instrument中已经能拿到某个时间段的Page In次数,那么如何和启动映射起来呢?
我们的答案是:os_signpost
。
os_signpost
是iOS 12开始引入的一组API,可以在Instruments绘制一个时间段,代码也很简单:
1os_log_t logger = os_log_create(“com.bytedance.tiktok”, “performance”); 2os_signpost_id_t signPostId = os_signpost_id_make_with_pointer(logger,sign); 3//标记时间段开始 4os_signpost_interval_begin(logger, signPostId, “Launch”,“%{public}s”, “”); 5//标记结束 6os_signpost_interval_end(logger, signPostId, “Launch”);
通常可以把启动分为四个阶段处理:
启动阶段
有多少个Mach-O,就会有多少个Load和C++静态初始化阶段,用signpost相关API对对应阶段打点,方便跟踪每个阶段的优化效果。
Linkmap
Linkmap是iOS编译过程的中间产物,记录了二进制文件的布局,需要在Xcode的Build Settings里开启Write Link Map File:
Build Settings
比如以下是一个单页面Demo项目的linkmap。
linkmap
linkmap主要包括三大部分:
-
Object Files 生成二进制用到的link单元的路径和文件编号
-
Sections 记录Mach-O每个Segment/p的地址范围
-
Symbols 按顺序记录每个符号的地址范围
ld
–
Xcode使用的链接器件是ld,ld有一个不常用的参数-order_file
,通过man ld
可以看到详细文档:
Alters the order in which functions and data are laid out. For each p in the output file, any symbol in that p that are specified in the order file file is moved to the start of its p and laid out in the same order as in the order file file.
可以看到,order_file中的符号会按照顺序排列在对应p的开始,完美的满足了我们的需求。
Xcode的GUI也提供了order_file选项: