【问题标题】:How can I subdivide a function when using Instruments Time Profiler使用 Instruments Time Profiler 时如何细分函数
【发布时间】:2011-07-27 08:23:14
【问题描述】:

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

【问题讨论】:

    标签: performance macos profiling instruments sampling


    【解决方案1】:

    使用宏:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

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

        【讨论】:

        • Shark 会进行每行报告,但我希望能够调整粒度并获得我指定的代码部分的报告。 Instruments 似乎无法进行逐行报告。
        • @Scott:真的吗?我认为 Instruments 是 Shark 的一切,甚至更多。如果他们退出每行报告,我会感到困惑。无论如何,我所依赖的方法是random-pausing。您可能想要调整粒度,但我建议真正有效的方法是堆栈的挂钟时间(不是 CPU)采样。我查看单个样本(不需要太多样本)并查看显示在多个样本上的线条。
        【解决方案4】:

        更新:

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

        https://github.com/nielsbot/Profiler


        我有一些可以在这里执行此操作的代码:我有一些您可能会在此处执行此操作的代码:https://gist.github.com/952456HTH

        您可以使用以下代码来分析函数的各个部分:

        -(void)myMethod
        {
            ProfilerEnter( __PRETTY_FUNCTION__ );
        
            // ... code ...
            {
                ProfilerEnter("operation x");
        
                // your code here
                // ...
        
                ProfilerExit("operation x");
            }
        
            ProfilerExit(__PRETTY_FUNCTION__);
        }
        

        【讨论】:

          猜你喜欢
          • 2020-02-24
          • 2012-06-28
          • 1970-01-01
          • 2015-01-10
          • 2015-05-26
          • 2020-09-03
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多