原理
按照固定的时间间隔,定时对线程中的调用堆栈进行采样,获取一个sample. 之后统计在这一时段内,某个方法出现在sample中次数。以此来表示该函数的运行情况
所以Long Running
和Repeatitive and Fast running
. 他们很可能被采样同样多的次数。
面板概念
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
证书
WWDC中提到
- 最好使用Release版本,这样可以使用编译器优化过的点,接近app真正的运行情况。
- 用真机测试。
实践中用release设置直接Profile时会报错。这是因为我们Release的证书设置,通常是用来打包的发布证书。我们可以在project setting里,将Release
的Provisioning File
改成调试版本。并且将Code Signing Identify
中设置改成iOS Developer
。之后就可以检测release版本的代码了。