Time Profiler可以衡量在某些方法上花费的时间。是否有类似的方法来衡量方法的调用次数?
答案 0 :(得分:4)
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代码。然后,您可以在模拟器中轻松地针对您的应用程序运行它。
同样,这不适用于设备,但如果您只想要调用某些内容的统计信息,而不是它运行的持续时间,那么这可能会起作用。