用于计算 iPhone 上方法调用次数的工具

Posted

技术标签:

【中文标题】用于计算 iPhone 上方法调用次数的工具【英文标题】:Instrument for count the number of method calls on iPhone 【发布时间】:2010-11-26 19:57:57 【问题描述】:

时间分析器可以测量在某些方法上花费的时间量。是否有类似的方法可以测量方法被调用的次数?

【问题讨论】:

【参考方案1】:

DTrace 可以做到这一点,但仅限于 iPhone 模拟器(Snow Leopard 支持,但 ios 尚不支持)。我在 MacResearch here 和 here 上有两篇关于这项技术的文章,我在其中介绍了一些使用 DTrace 查找特定方法以及何时调用它们的案例研究。

例如,我创建了以下 DTrace 脚本来测量在具有 CP 前缀的类上调用方法的次数,以及在这些方法中花费的总时间:

#pragma D option quiet
#pragma D option aggsortrev

dtrace:::BEGIN

    printf("Sampling Core Plot methods ... Hit Ctrl-C to end.\n");
    starttime = timestamp;      


objc$target:CP*::entry

    starttimeformethod[probemod,probefunc] = timestamp;
    methodhasenteredatleastonce[probemod,probefunc] = 1;


objc$target:CP*::return
/methodhasenteredatleastonce[probemod,probefunc] == 1/

    this->executiontime = (timestamp - starttimeformethod[probemod,probefunc]) / 1000;
    @overallexecutions[probemod,probefunc] = count();
    @overallexecutiontime[probemod,probefunc] = sum(this->executiontime);
    @averageexecutiontime[probemod,probefunc] = avg(this->executiontime);


dtrace:::END 

    milliseconds = (timestamp - starttime) / 1000000;
    normalize(@overallexecutiontime, 1000);
    printf("Ran for %u ms\n", milliseconds);
    printf("%30s %30s %20s %20s %20s\n", "Class", "Method", "Total CPU time (ms)",  "Executions", "Average CPU time (us)");
    printa("%30s %30s %20@u %20@u %20@u\n", @overallexecutiontime, @overallexecutions, @averageexecutiontime);

这会生成以下格式良好的输出:

        Class                         Method  Total CPU time (ms)           Executions Average CPU time (us)
      CPLayer                -drawInContext:                 6995                  352                19874
       CPPlot                -drawInContext:                 5312                   88                60374
CPScatterPlot      -renderAsVectorInContext:                 4332                   44                98455
CPXYPlotSpace        -viewPointForPlotPoint:                 3208                 4576                  701
       CPAxis               -layoutSublayers                 2050                   44                46595
CPXYPlotSpace -viewCoordinateForViewLength:linearPlotRange:plotCoordinateValue:                 1870                 9152
...

虽然您可以从命令行创建和运行 DTrace 脚本,但最好的办法可能是在 Instruments 中创建自定义仪器并在该仪器中填写适当的 D 代码。然后,您可以轻松地在模拟器中针对您的应用程序运行它。

同样,这在设备上不起作用,但如果您只想统计某项调用的次数,而不是它运行的持续时间,这可能会起作用。

【讨论】:

Brad Larson - 你说:“你最好的选择是在 Instruments 中创建一个自定义仪器并在该仪器中填写适当的 D 代码” - 我该怎么做?当我这样做时,仪器会抱怨语法错误... 具体来说,我将如何在上面输入你的脚本,看起来它会做我想要的:-) 哈哈,其他人为此苦苦挣扎 - 两年前:***.com/questions/17925261/… @shmim - 我已经用存档的链接替换了链接,因为他们在保持网站正常运行时遇到了问题。曾经是一个很好的、可靠的资源,但时间对它并不友好。就设置自定义工具而言,他们可能在过去五年中改变了这些操作的方式,但第二个链接显示了您过去如何能够采用上述方法并将其转变为自定义工具。以上是在命令行运行的完整 DTrace 脚本,不能逐字逐句地导入到仪器中。 太棒了!这些文章太棒了,让他们更容易找到对于任何在 DTrace 上寻找信息的人来说都是极好的!谢谢!

以上是关于用于计算 iPhone 上方法调用次数的工具的主要内容,如果未能解决你的问题,请参考以下文章

使用strace工具故障排查的5种简单方法

iPhone - 在泛型类中引用应用程序委托

程序性能调优工具之gprob

工具栏上的按钮应该调用位置管理器方法

python模拟蒙特卡罗法计算圆周率的近似ŀ

python模拟蒙特卡罗法计算圆周率的近似值