浏览了一下别人大牛的博客,做个总结和实践。
检测app启动时间的方法:
新增变量DYLD_PRINT_STATISTICS,值设为YES。
想要更详细的启动信息可以设置DYLD_PRINT_STATISTICS_DETAILS,值设为YES
然后command+R直接运行就可以在控制台看到详细的信息了。
这里我随便找了个demo运行,为了让效果更明显加了很多的第三方库。
运行完看到控制台的信息:
QAQ因为加了很多第三方库,所以一共762毫米,第一步就用了603毫秒,非常的大,然后我去别人博客下面了解了每个步骤的含义。
1. dylib loading 动态库加载
2.rebase/binding:就是对动态库的链接和绑定,因为动态库加载完成后,他们每一个都是独立的,要把她们串起来,所以第一步的时间跟第二步的时间是成正比的
rebase
将镜像读入内存,修正镜像内部的指针,性能消耗主要在IO
。
bind
是查询符号表,设置指向镜像外部的指针,性能消耗主要在CPU
计算。
3.objc setup:主要就是维护一张关于全部类的一些属性和方法,类名等等东西的一张表。
主要工作一:读取文件中的所有类,注册到当中,二:读取所有分类,将分类加载到类对象当中。
4.initialize time:
这一份指代的是执行+initialize
方法的时间。如果你执行了+load
方法(不建议),尽量使用+initialize
代替。
所以优化根据每个步骤都有一个优化方向:
1.减少动态库
2.少写点类,或者把不用的类移除掉。
3.使用懒加载
检测项目中没用的类的工具:https://github.com/hsfgithub/xcodeprojectarrangementtool
下载下来直接xcode运行即可,使用简单
区分一个库是动态库还是静态库的方法:
静态库结尾:lib,framework
动态库:dll,framework
因为framwork结尾的文件可以是动态库,也可以是静态库所以看文件后缀不太好。
所以可以直接使用xcode里面的工具
搜索mach,可以发现alamofire是动态库。
实践
删除一些动态库,重新运行
可以看到时间还是减少的挺多的。
因为这是一个小demo,主要的耗时还是在动态库,我切换一个大一点的项目看看时间构成。
额,好像也差不多,动态库雀氏是妨碍启动的大头。
参考文章:iOS App启动优化(一):检测启动时间 - 掘金