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

时间:2010-11-26 19:57:58

标签: iphone instruments

Time Profiler可以衡量在某些方法上花费的时间。是否有类似的方法来衡量方法的调用次数?

1 个答案:

答案 0 :(得分:4)

DTrace可以做到这一点,但只能在iPhone模拟器中使用(Snow Leopard支持,但iOS尚未支持)。我在MacResearch herehere上有两篇关于此技术的文章,在这里我将介绍一些使用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代码。然后,您可以在模拟器中轻松地针对您的应用程序运行它。

同样,这不适用于设备,但如果您只想要调用某些内容的统计信息,而不是它运行的持续时间,那么这可能会起作用。