按照固定的时间间隔,定时对线程中的调用堆栈进行采样,获取一个sample. 之后统计在这一时段内,某个方法出现在sample中次数。以此来表示该函数的运行情况
一、打开Instruments 再打开Time Profiler
启动Xcode -> Instruments
二、点击开始运行按钮,运行目标APP
Weight
Doesn’t measure duration. Aggregates samples into a useful summary.
weight的前面可以看到也有ms的时间。但是weight不代表duration. 这是 采样次数*采样间隔。采样间隔通常是1ms
所以更合理的观察方法是参考Weight的百分比值。
Self Weight
该函数在自己的函数体内花费的时间。有的函数A内部只是简单调用其他函数B。这时A的Weight虽然可能高,但是它的Self Weight几乎为0. 可以进一步观察其子函数B. Weight高并且Self weight也高的是真正耗时的函数。
Call Tree
点击下方Call Tree按钮,可以看到有一些勾选项
Hide System Libraries。
这个很有用,可以屏蔽掉系统的的调用。这部分通常不是关注的Invert Call Tree
堆栈默认是从上往下显示的。勾选这个后会反向显示,可以把耗时的子调用直接显示出来。其他也有各自的功能
图形显示区域
- 可以拖动游标,选定只观察某一个时间范围内的采样数据。
- 可以点击左侧MainThread栏,从而只观察发生在MainThread上的采样数据
- 使用
option +
和option -
来zoom in
和zoom out
- 堆栈显示面板,按住
option
点击箭头,可以把子调用树全部展现,不用一级一级点。
符号加载
对检测到的我们项目自己的函数,Instrument有时显示的只是函数地址,这是因为app相关的符号文件没有加载进来。
如果有app该版本的符号文件,可以 Menu -> Files -> Symbols。 分别选择app以及framework的符号文件。
tips: 如果是debug模式的包,默认pod库编译的framework是没有符号的。如果需要,可以在Xcode的面板中选择 Pods -> Project Pods -> Build Settings -> Build Options -> Debug Information Format -> DWARF with dSYM File
三、工具栏设置,方便快速定位问题
Separate by State : 线程分离,状态分开显示 ,例如:Running状态,
Separate by Thread : 线程分离, 每个线程分开显示,只有这样 才能在调用路径中能够清晰看到占用CPU耗时最大的线程.
Invert Call Tree : 从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FunA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
Hide System Libraries : 隐藏系统调用,只关注自己代码的耗时
Flatten Recursion : 递归函数, 每个堆栈跟踪一个条目
Top Functions : 显示某个函数的总时间,A函数内调用多个函数时,可以显示A函数的总耗时