如何显示在仪器时间分析器中调用函数的次数

时间:2011-10-16 21:23:22

标签: ios xcode macos profiling instruments

我已尝试过所有可能的字段,但无法找到调用函数的次数。

enter image description here

此外,我没有得到Self# Self。这两个数字意味着什么?

4 个答案:

答案 0 :(得分:16)

还有其他几种方法可以实现这一目标。一个显然是创建一个静态命中计数器和一个发出并递增计数器的NSLog。这是侵入性的,我找到了一种用lldb做到这一点的方法。

  1. 设置断点
  2. 执行程序,直到第一次到达断点并记下您所点击的行右侧的断点号(例如“线程1:断点7.1”,注意7.1)
  3. 上下文单击断点并选择“编辑断点”
  4. 将条件留空并选择“添加操作”
  5. 选择“调试器命令”
  6. 在命令框中,输入“断点列表7.1”(使用步骤2中断点的断点号)。如果您使用的是gdb,我相信您可以使用“info break”。enter image description here
  7. 选中“评估后自动继续”选项 Breakpoint setup
  8. 继续
  9. 现在,llvm将发出有关断点的信息,包括传递的次数,而不是停止。

    至于Glenn和Mike在前一个答案之间的讨论,我将描述一个性能问题,其中函数执行计数很有用:我的应用程序中有一个特定的操作,其中每次执行操作时性能都会显着下降。仪器时间分析器显示,每次执行操作时,特定功能所花费的时间是之前的两倍,直到应用程序快速挂起(如果操作重复执行)。通过计数,我能够确定每次执行时,函数被调用的次数是之前执行的次数的两倍。然后很容易找到原因,结果是有人在每次事件执行时重新注册NotificationCenter中的通知。这会使每次执行时响应处理程序调用的数量加倍,从而每次都会使函数的“成本”加倍。知道它被翻了两倍,因为它被调用了两次而不是因为性能变差而导致我查看调用序列,而不是因为函数本身可能会随着时间的推移而降级。

答案 1 :(得分:3)

似乎您无法使用Time Profiler来计算函数调用。这question似乎解决了潜在的计数方法。

W /尊重自我 #self

根据时间分析器上的Apple Docs

Self “符号自称的次数。”

从数字的方式来看,似乎self是在其堆栈轨迹底部具有此符号的样本的总和持续时间。这将使:

  • # self:此符号位于堆栈跟踪底部的样本数
  • % self:自我样本相对于当前显示的调用树的总样本的百分比
    • (例如 - #self / total samples)。

因此,这不会告诉您调用方法的次数。但它会让你知道在方法中花费了多少时间或在调用树中花费了更少的时间。



注意:我也不确定各种“自我”的含义。很想看到有人以权威的方式回答这个问题。到了这里寻找...

答案 2 :(得分:2)

虽然它很有趣,但知道所调用的次数与它们花费的时间没有任何关系。这就是Time Profiler的全部内容。事实上,由于它采样,它无法回答多少次。

答案 3 :(得分:-2)

如果你的目标是找出你需要修复的东西,以尽快使程序,

通话次数和自我时间可能很有趣,但无关紧要。

查看my answer to this question,特别是第6和第8点。

编辑:为了进一步阐明这一点,假设以下是执行程序的时间表。有些时间(在这种情况下大约50%)用于可以删除的活动,如果你知道它是什么,例如不必要的埋藏I / O,过度调用new,失控通知,或者“无关紧要”的数据验证。如果采用随机时间样本,则该活动有50%的可能性发生,并且对调用堆栈和/或程序变量的检查表明它正在执行可以删除的操作。然后,如果采集了10个这样的样本,则无论活动是在几个大块时间内发生,还是在许多小的时间内,都会在大约5个样本中看到活动。活动可能是函数执行不必要的几行代码,也可能是更通用的东西。无论如何,你认识它,修复它,并获得大约2倍的加速。通话计数和自我时间对此过程没有任何贡献。

enter image description here