我正在通过探查器运行应用程序,采样率为1 ms,但我无法理解列标题的含义。 documentation似乎缺少大多数列标题的定义,但我设法破译自我,#Self 和 Self%从答案here。这就是我到目前为止所做的:
列标题的其余部分似乎是上述的组合(可能是由于1ms的采样率)或者是不言自明的。例如,我有一个函数,总时间为647621ms(89.4%),但自 / #Self 为9.这是否意味着该函数经常被调用,但需要很少的时间来执行?另一方面,另一个函数需要15559ms的总时间(2.1%),但自 / #Self 是13099,这意味着它被调用的次数较少,但需要更长的时间来完成。我是在正确的轨道上吗?
答案 0 :(得分:2)
最新版本的仪器没有“总样本”列,但我将解释总样本,总时间和自我之间的差异,因为它解释了Time Profiler仪器的工作原理。 Time Profiler工具默认每隔毫秒定期记录一次调用堆栈。 “总样本”列显示方法在调用堆栈中的样本数。 “总时间”列告诉您方法在调用堆栈中的时间量。 Self列告诉您方法位于调用堆栈顶部的样本数,这意味着当Instruments记录样本时,您的应用程序位于方法中。
“自我”列比“总样本”和“总时间”列重要得多。 main()函数将具有较高的总样本数和较长的总时间,因为main()在应用程序运行的整个时间都在调用堆栈中。但是花时间在Cocoa / Cocoa Touch应用程序中优化main()函数是浪费时间,因为所有main()都会启动应用程序。专注于具有高自我价值的方法。
最新版本的Instruments具有“运行时间”列。列中的每个列表都有两个值:时间和百分比。时间对应于您问题中的总时间。百分比对应于您问题中的总百分比。
<强>更新强>
让我回答最后一段中关于你的功能例子的问题。您的应用程序在第一个示例中没有花费太多时间在函数内部(我将其称为函数A),因为它的Self条目仅为9.这意味着您的应用程序在函数A中只有9个示例。时间意味着您的应用程序在函数A调用的函数中花费了大量时间。函数A经常在调用堆栈中,但不经常在调用堆栈的顶部。
在你的第二个例子中,应用程序在函数B中花费更多时间,因为它的Self条目是13099.应用程序不会在函数B调用的函数上花费大量时间,因为总时间要小得多。函数B比A更频繁地位于调用堆栈的顶部,并且在调用堆栈中的频率低于A.如果在应用程序中存在性能问题,则函数B将是检查提高其性能的方法的函数。优化函数A没有多大帮助,因为它的Self条目只有9。