如何在使用Instruments Time Profiler时细分功能

时间:2011-04-01 00:26:02

标签: performance macos profiling instruments sampling

我有一个相对较长的功能,在仪器时间分析器中占主导地位。有没有办法在此函数中添加其他符号,以便采样将显示分配给函数不同部分的时间?我正在寻找类似于1年前教授存在的MARK宏的东西。

4 个答案:

答案 0 :(得分:6)

使用宏:

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

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

答案 1 :(得分:5)

我最近发现,在乐器的时间分析器中,如果双击某个方法,它会向您显示源代码,其中包含每行所用时间的百分比。

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

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

答案 2 :(得分:1)

我被告知鲨鱼可以做到这一点,所以乐器也应该这样做,但你必须告诉它该怎么做:

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

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

堆栈示例包括PC和每个通往PC所在位置的调用指令。 堆栈中的每条指令都共同负责花费的时间。

因此,任何负责X%时间的代码行都将在X%的时间内处于堆栈中。如果它足够值得值得关注,你会在样品上看到它。您可能会获得大量样本,但实际上并不需要太多样本。这是因为找到问题比定位更精确更重要。

如果您的最大问题在修复后会节省5%,则会出现约5%或更多的样本。如果它小于那个,那么你的代码就非常优秀了。它有可能比它大得多,所以你不会有任何麻烦去看它究竟在哪里。

已添加:执行挂壁时间堆栈采样并逐行显示的探查器示例为Zoom,因此建议您观看该视频。然后,尝试让仪器做同样的事情。

答案 3 :(得分: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__);
}