3

我有一个相对较长的函数,它在 Instruments Time Profiler 中占主导地位。有没有办法向这个函数添加额外的符号,以便采样显示分配给函数不同部分的时间?我正在寻找类似于 prof(1) 年前存在的 MARK 宏之类的东西。

4

4 回答 4

6

使用宏:

#define MARK(K) asm("M."#K":");

对我来说一直很好。这实际上只是我在原始问题中提到的旧 MARK 宏的简化。放置标记(LOOP1);函数中的某处将添加一个新符号 M.LOOP1,它将显示在鲨鱼或仪器显示的函数列表中。

于 2011-05-06T12:42:10.800 回答
5

我最近发现,在仪器的时间分析器中,如果你双击一个方法,它会显示你的源代码以及每行花费的时间百分比。

http://douglasheriot.com/blog/2011/04/xcode-4-instruments-awesomeness/

我发现它非常有用,但我不确定这是否是您所要求的。

于 2011-05-03T14:22:55.153 回答
1

我被告知 Shark 可以做到这一点,所以 Instruments 也应该这样做,但你必须告诉它要做什么:

  • 在挂钟时间(不仅仅是 CPU 时间)上对函数调用堆栈(不仅仅是程序计数器 PC)进行采样。

  • 告诉您出现在很大比例的堆栈样本上的代码行(不仅仅是函数)。

堆栈样本包括 PC 和通向 PC 所在位置的每条调用指令。堆栈上的每条指令共同负责所花费的那部分时间。

因此,负责 X% 时间的任何代码行将有 X% 的时间在堆栈上。如果它大到值得一看,你会在样品上看到它。你可能会得到很多样本,但实际上并不需要很多。这是因为定位问题比精确测量问题更重要。

如果您最大的问题在解决后能为您节省 5%,那么它将出现在大约 5% 或更多的样本上。如果它比这更小,那么您的代码就非常理想。它可能比这大得多,因此您可以毫不费力地准确查看它的位置。

补充:进行壁时间堆栈采样并按行显示百分比的分析器示例是Zoom,因此我建议您观看该视频。然后,尝试让 Instruments 做同样的事情。

于 2011-04-01T01:21:07.607 回答
1

更新:

我更新了代码并创建了一个单独的项目:

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__);
}
于 2011-05-04T06:31:22.477 回答