如何在Xcode13中查看App启动premain时间 DYLD_PRINT_STATISTICS失效如何处理
从Xcode13配套的dyld版本开始,传统的
DYLD_PRINT_STATISTICS环境变量已被废弃,因此无法正常输出premain阶段的耗时统计,可通过以下3种方法获取对应数据:
方法1:使用适配Xcode13+的dyld环境变量
- 打开Xcode项目的
Scheme设置,选择Run->Arguments标签页 - 在
Environment Variables列表中添加新的键值对:键为DYLD_PRINT_STATISTICS_DETAILS,值为1 - 运行项目后在Xcode控制台搜索
total time,即可看到完整的premain阶段耗时拆分,包含动态库加载、符号重绑定、ObjC类注册、初始化器执行等各细分环节的耗时 - 注意:如果是真机调试,需要关闭
Release模式的编译优化,否则部分统计数据可能被裁剪无法输出
方法2:使用Instruments的App Launch模板统计
- 点击Xcode顶部菜单栏
Product->Profile启动Instruments工具 - 在模板选择窗口选中
App Launch模板,点击运行按钮开始采集 - 等待App完全启动后停止采集,即可在时间线面板中看到完整的启动阶段拆分,其中
App Start区间内main()函数之前的部分就是premain总耗时,还可逐层展开查看每个子环节的耗时细节
方法3:代码手动统计premain总耗时
如果只需要获取premain总耗时不需要细分数据,可以通过代码计算进程创建时间到main函数执行的时间差:
- 在项目中新建实现文件,添加以下代码获取进程启动时间戳:
#import <sys/sysctl.h> #import <CoreFoundation/CoreFoundation.h> static CFAbsoluteTime processStartTime = 0; CFAbsoluteTime getProcessCreateTime() { struct kinfo_proc procInfo; size_t len = sizeof(procInfo); int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; sysctl(mib, sizeof(mib)/sizeof(*mib), &procInfo, &len, NULL, 0); return procInfo.kp_proc.p_starttime.tv_sec + procInfo.kp_proc.p_starttime.tv_usec / 1000000.0; } __attribute__((constructor(101))) void markProcessStart() { processStartTime = getProcessCreateTime(); }
- 在
main.m的第一行添加耗时计算逻辑:
CFAbsoluteTime premainCost = CFAbsoluteTimeGetCurrent() - processStartTime; NSLog(@"premain总耗时:%.2fms", premainCost * 1000);
- 注意:constructor函数的优先级设置为101即可,不要设置低于100的优先级,避免和系统自带的初始化逻辑冲突
内容的提问来源于stack exchange,提问作者WQDev2013
相关产品推荐
相关产品推荐

