WWDC 2016 中首次出现了 App 启动优化的话题,其中提到:
• App 启动最佳速度是400ms以内,因为从点击 App 图标启动,然后 Launch Screen 出现再消失的时间就是400ms;
• App 启动最慢不得大于20s,否则进程会被系统杀死;(启动时间最好以 App 所支持的最低配置设备为准。)
APP启动时间:以main()为分界点,分为main()方法执行之前的加载时间(pre-main time)和main()之后的加载时间。
main()方法之前启动时间的测量方法(pre-main):

- 添加环境变量参数:在Xcode -> Product -> Scheme -> Edit Scheme -> run -> Arguments。配置参数:DYLD_PRINT_STATISTICS
如果想打印详细的pre-main中各个过程花费的时间。配置参数:DYLD_PRINT_STATISTICS_DETAILS

main()方法之后的启动时间的测量方法:
1.在main()中定义一个全局变量,记录时间。
//定义一个全局变量
CFAbsoluteTime MainStartTime;
int main(int argc, char * argv[]) {
//赋值当前时间
MainStartTime = CFAbsoluteTimeGetCurrent();
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
- 在 AppDelegate.m 文件中用 extern 声明全局变量 MainStartTime。
extern CFAbsoluteTime MainStartTime;
- 在AppDelegate的application:didFinishLaunchingWithOptions:方法结束前,再获取一下当前时间,与 MainStartTime 的差值就是 main 函数阶段的耗时。
double mainLaunchTime = (CFAbsoluteTimeGetCurrent()- MainStartTime);
NSLog( @"main 阶段耗时:%.2fms", mainLaunchTime * 1000);
检测完整的启动时间
借助 Instruments 的 Time Profiler 工具查看耗时。
打开方式为:Xcode → Open Developer Tool → Instruments → Time Profiler。
操作步骤:
1、配置 Scheme。点击 Edit Scheme 找到 Profile 下的 Build Configuration,设置为 Debug。
2、配置 PROJECT。点击 PROJECT,在 Build Settings 中找到 Build Options 选项里的 Debug Information Format,把 Debug 对应的值改为 DWARF with dSYM File。
3、启动 Time Profiler,点击左上角红色圆形按钮开始检测,然后就可以看到执行代码的完整路径和对应的耗时。
为了方面查看应用程序中实际代码的执行耗时和代码路径实际所在的位置,可以勾选上 Call Tree 中的 Separate Thread 和 Hide System Libraries。
