You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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函数执行的时间差:

  1. 在项目中新建实现文件,添加以下代码获取进程启动时间戳:
#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();
}
  1. 在main.m的第一行添加耗时计算逻辑:
CFAbsoluteTime premainCost = CFAbsoluteTimeGetCurrent() - processStartTime;
NSLog(@"premain总耗时:%.2fms", premainCost * 1000);
  • 注意:constructor函数的优先级设置为101即可,不要设置低于100的优先级,避免和系统自带的初始化逻辑冲突

内容的提问来源于stack exchange,提问作者WQDev2013

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:39:02