Kevinlma的博客

物来顺应,未来不迎,当时不杂,既过不恋

0%

Time Profiler使用Tips

原理

按照固定的时间间隔,定时对线程中的调用堆栈进行采样,获取一个sample. 之后统计在这一时段内,某个方法出现在sample中次数。以此来表示该函数的运行情况

所以Long RunningRepeatitive 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按钮,可以看到有一些勾选项

  1. Hide System Libraries。
    这个很有用,可以屏蔽掉系统的的调用。这部分通常不是关注的

  2. Invert Call Tree
    堆栈默认是从上往下显示的。勾选这个后会反向显示,可以把耗时的子调用直接显示出来。

  3. 其他也有各自的功能

图形显示区域

  1. 可以拖动游标,选定只观察某一个时间范围内的采样数据。
  2. 可以点击左侧MainThread栏,从而只观察发生在MainThread上的采样数据
  3. 使用option +option -zoom inzoom out
  4. 堆栈显示面板,按住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中提到

  1. 最好使用Release版本,这样可以使用编译器优化过的点,接近app真正的运行情况。
  2. 用真机测试。

实践中用release设置直接Profile时会报错。这是因为我们Release的证书设置,通常是用来打包的发布证书。我们可以在project setting里,将ReleaseProvisioning File改成调试版本。并且将Code Signing Identify中设置改成iOS Developer。之后就可以检测release版本的代码了。