开发过程中经常需要进行app中耗时操作检测,一般方法是使用instrument的time profile来检测.
time profile的检查原理很简单就是定时抓取线程上的方法堆栈调用,计算一段时间内的各个方法的耗时.
因为模拟器的硬件全部基于主机,性能远比真机要好很多,为尽最大可能还原真实情况,检测时一般用真机,且是release版本的app.
小插曲:
我在打包release版本是用Ad Hoc证书,但打包出来,time profile无法启动,报以下错误,原因未知,有知道的要告诉我哦.
Time_Profile_Fail.png
折腾了半天,导出时选择Developement就能正常运行起来,现在还不清楚是因为什么.
Time_Profile_Export.png
用手机装上打包出来的ipa文件,在instrument运行,检测,这时会看到全是二进制地址,没有被符号化,
Time_Profile_NoSymbol.png
不用急,只需继续检测,直到检测完成,点击左上角停止按钮,停止检测.然后File->Symbols
进行配置
Time_Profile_Configure.png
注意:配置时配置的是Binary Path,这个路径对应的内容来源是将ipa文件解压,取解压后的二进制文件;dsYM path是自动搜索匹配的,所以打包生成的archive文件本地一定得有;如果archive文件中没有dsYM文件,那么则需要查看项目中build settiing中Debug Information Format中是否选的是DWARF with dSYM File.
配置完成后原先的二进制就会被符号化了,这时就可以查看具体的耗时方法了.为了方便产看分析,instrument有很多条件项可供选择
Time_Profile_Filter.png
Input Filter & Involves Symble:用于直接过滤的,简单明了
Call Tree:调用树,里面有很多选项
- Separate by Thread:以线程分类,能很清晰看出每个线程总消耗时间
- Invert Call Tree:选中该选项后,调用栈会自上至下显示,这个通常是需要选中的,选中后调用栈中最深的方法被显示最上面.
- Hide System Libraries:隐藏系统库相关方法,只显示自己app中出现的符号
- Flatten Recursion:该选项将每一个调用栈中的递归函数视作单一入口,而不是多入口。
-
Top Functions:该选项是相当于归总显示,显示的是方法的总耗时,双击后定位到源码处会逐一显示内部调用的其他方法的耗时时间.这一选项非常有用,因为它能让你在每次进入调用栈时找到花费最长的时间,瞄准你最耗时的方法。
Time_Profile_Call_Tree.png
Call Tree Constraints:用于过滤的,可以对时间进行过滤,如可以过滤掉小于10ms的数据,可以在Min中填入10
下面进入具体分析阶段,我分析的是启动时的耗时
Time_Profile_Result.png
1.主线程耗时最大花费60ms,用于加载图片,图片比较大,耗时,可以压缩图片优化
2.其他大部分消耗用于UI的构建
选中Top Function后
Time_Profile_Result_Top_Function.png
1.发现didFinishLaunchingWithOptions方法消耗了大量时间,里面进行了大量的配置工作,优化时可以将不必要的配置移除掉.
2.viewDidLoad方法可以UI的懒加载来优化
以上主要是针对Time-Profile的使用,分析的话要具体案例具体对待,仁者见仁智者见智,关于启动优化的文章,强烈推荐下面这一篇,有兴趣的请移步https://mp.weixin.qq.com/s/Kf3EbDIUuf0aWVT-UCEmbA
网友评论