什么是在运行时测量和跟踪各种调用的性能的最佳方法?

时间:2010-03-03 01:22:58

标签: iphone xcode debugging optimization performance

我正在尝试优化代码的性能,但我一般不熟悉xcode的调试器或调试器。是否可以跟踪在运行时进行的调用的执行时间和频率?

想象一段事件链,在几分之一秒内有一些递归调用。跟踪CPU花费大部分时间的最佳方法是什么?

非常感谢。

编辑:也许最好问一下,如何使用xcode调试工具进行堆栈跟踪?

3 个答案:

答案 0 :(得分:6)

您想要使用名为“工具”的内置性能工具,请查看“工具for iPhonefor Mac的Apples指南”。具体来说,你可能想要System Instruments。还有Tuning Guide对您和Shark

有用

答案 1 :(得分:2)

  

想象一下有一些事件链   递归调用超过一小部分   第二。什么是追踪的最佳方式   CPU花费大部分时间的地方?

以前回答的简短版本。

  1. 学习IDE或调试器。确保它有一个“暂停”按钮,或者你可以在程序运行并且耗时太长时中断它。

  2. 如果您的代码运行得太快而无法手动暂停,请在其周围进行10到1000次临时循环。

  3. 暂停时,将调用堆栈的副本复制到某个文本编辑器中。重复几次。

  4. 你的答案将在那些堆栈中。如果CPU将大部分时间花在语句中,那么该语句将位于大多数堆栈样本的底部。如果有一些函数调用导致大部分时间被使用,that function call will be on most of the stacks。如果它是递归的并不重要 - 这只意味着它在堆栈上不止一次出现。

    不要考虑测量微秒或计算呼叫。考虑“活跃时间的百分比”。这就是堆栈样本告诉你的,如果你修复它,那大概就是你要节省的。

    就这么简单。

    顺便说一句,当你解决这个问题时,你会得到一个加速因子。然后,代码中的其他问题将被该因素放大,因此它们将更容易找到。通过这种方式,你可以继续前进,直到你挤出每个循环。

答案 2 :(得分:0)

我告诉人们的第一件事是认识到

之间的区别

1)计时例程并计算它们被调用的次数,以及

2)找到可以有效优化的代码。

对于(1),有仪器分析器。 要在(2)中取得成功,您需要一种罕见的分析器。

需要一个采样分析器
  • 对整个调用堆栈进行采样,而不仅仅是程序计数器

  • 随机挂钟时间的样本,而不仅仅是CPU,以便捕获可能的I / O问题

  • 您希望的样本(不是在等待用户输入时)

  • 输出
  • ,为堆栈样本上显示的每行代码提供 包含该行的样本百分比。如果那条线不在那里,那就是可以节省的总时间的直接量度。

(我实际上是手工完成,在调试器下中断程序。)

不要因为你没有的问题而陷入困境,例如

  • 测量精度。如果30%的调用堆栈样本中出现一行代码,则实际成本可能在30%左右的任何范围内。如果你能找到一种方法来消除它或者少用它来调用它,你就可以节省成本,即使你事先并不确切知道它的成本是什么。

  • 抽样效率。由于您不需要时间测量的准确性,因此您不需要大量样本。即使您获得大量样本,它们也不会显着地扭曲结果,因为它们无法发现昂贵的代码行。

  • 调用图表。他们制作漂亮的图形,但不是你需要知道的。调用图上的弧对应于最佳情况下的代码行,通常是多行,因此知道弧的成本仅在最佳情况下告知行的成本。当你需要找到的是代码行时,调用图集中在函数上。调用图包含在递归问题中,这与无关

了解期待的内容非常重要。许多程序员使用传统的分析器,可以获得20%的改进,认为非常好,将分析器视为胜利者,然后停在那里。其他人,使用大型程序,通常可以获得20次的加速因子。 这是通过修复问题的系列来完成的,每个问题都给出了乘法加速因子。一旦探查器无法找到下一个问题,该过程就会停止。这就是为什么“足够好”还不够好。

Here is a brief explanation of the method.