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

an0*_*an0 13 macos xcode profiling instruments ios

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

在此输入图像描述

此外,我没有得到Self# Self.这两个数字是什么意思?

Pat*_*Pat 17

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

  1. 设置断点
  2. 执行程序,直到你第一次到达断点并记下你击中的线右边的断点号(例如"线程1:断点7.1",注意7.1)
  3. 上下文单击断点并选择"编辑断点"
  4. 将条件留空并选择"添加操作"
  5. 选择"调试器命令"
  6. 在命令框中,输入"断点列表7.1"(使用步骤2中断点的断点号).如果你使用的是gdb,我相信你可以使用"info break".在此输入图像描述
  7. 选中"评估后自动继续"选项 断点设置
  8. 继续

现在,llvm将发出有关断点的信息,包括传递的次数,而不是停止.

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

  • 执行此操作的类似方法是使用"日志消息"断点操作,并在消息中使用特殊字符串`%H`转换为命中计数,而'%B`转换为断点名称.我正在使用`%B hit%H`. (2认同)

Dav*_*ham 3

虽然很有趣,但知道调用的次数与在其中花费的时间没有任何关系。这就是时间分析器的全部内容。其实既然是采样,它就无法回答多少次。

  • 了解调用方法的次数可能与在函数中花费的时间有关,因为如果您的逻辑无意中调用方法的次数超过了应有的次数,则会导致在该方法中花费更多的时间。因此,了解方法调用计数是有好处的,因为它允许您评估逻辑以确保不会不必要地调用该方法。 (7认同)
  • + 很高兴听到一些常识! (3认同)