我有一个相对较长的函数,它在 Instruments Time Profiler 中占主导地位。有没有办法向这个函数添加额外的符号,以便采样显示分配给函数不同部分的时间?我正在寻找类似于 prof(1) 年前存在的 MARK 宏之类的东西。
4 回答
使用宏:
#define MARK(K) asm("M."#K":");
对我来说一直很好。这实际上只是我在原始问题中提到的旧 MARK 宏的简化。放置标记(LOOP1);函数中的某处将添加一个新符号 M.LOOP1,它将显示在鲨鱼或仪器显示的函数列表中。
我最近发现,在仪器的时间分析器中,如果你双击一个方法,它会显示你的源代码以及每行花费的时间百分比。
http://douglasheriot.com/blog/2011/04/xcode-4-instruments-awesomeness/
我发现它非常有用,但我不确定这是否是您所要求的。
我被告知 Shark 可以做到这一点,所以 Instruments 也应该这样做,但你必须告诉它要做什么:
在挂钟时间(不仅仅是 CPU 时间)上对函数调用堆栈(不仅仅是程序计数器 PC)进行采样。
告诉您出现在很大比例的堆栈样本上的代码行(不仅仅是函数)。
堆栈样本包括 PC 和通向 PC 所在位置的每条调用指令。堆栈上的每条指令共同负责所花费的那部分时间。
因此,负责 X% 时间的任何代码行将有 X% 的时间在堆栈上。如果它大到值得一看,你会在样品上看到它。你可能会得到很多样本,但实际上并不需要很多。这是因为定位问题比精确测量问题更重要。
如果您最大的问题在解决后能为您节省 5%,那么它将出现在大约 5% 或更多的样本上。如果它比这更小,那么您的代码就非常理想。它可能比这大得多,因此您可以毫不费力地准确查看它的位置。
补充:进行壁时间堆栈采样并按行显示百分比的分析器示例是Zoom,因此我建议您观看该视频。然后,尝试让 Instruments 做同样的事情。
更新:
我更新了代码并创建了一个单独的项目:
https://github.com/nielsbot/Profiler
我有一些可以在这里执行此操作的代码:我有一些您可能会在此处执行此操作的代码:https: //gist.github.com/952456 HTH
您可以使用以下代码分析函数的部分,如下所示:
-(void)myMethod
{
ProfilerEnter( __PRETTY_FUNCTION__ );
// ... code ...
{
ProfilerEnter("operation x");
// your code here
// ...
ProfilerExit("operation x");
}
ProfilerExit(__PRETTY_FUNCTION__);
}