我正在尝试优化代码的性能,但我一般不熟悉xcode的调试器或调试器。是否可以跟踪在运行时进行的调用的执行时间和频率?
想象一段事件链,在几分之一秒内有一些递归调用。跟踪CPU花费大部分时间的最佳方法是什么?
非常感谢。
编辑:也许最好问一下,如何使用xcode调试工具进行堆栈跟踪?
答案 0 :(得分:6)
您想要使用名为“工具”的内置性能工具,请查看“工具for iPhone和for Mac的Apples指南”。具体来说,你可能想要System Instruments。还有Tuning Guide对您和Shark
有用答案 1 :(得分:2)
想象一下有一些事件链 递归调用超过一小部分 第二。什么是追踪的最佳方式 CPU花费大部分时间的地方?
以前回答的简短版本。
学习IDE或调试器。确保它有一个“暂停”按钮,或者你可以在程序运行并且耗时太长时中断它。
如果您的代码运行得太快而无法手动暂停,请在其周围进行10到1000次临时循环。
暂停时,将调用堆栈的副本复制到某个文本编辑器中。重复几次。
你的答案将在那些堆栈中。如果CPU将大部分时间花在语句中,那么该语句将位于大多数堆栈样本的底部。如果有一些函数调用导致大部分时间被使用,that function call will be on most of the stacks。如果它是递归的并不重要 - 这只意味着它在堆栈上不止一次出现。
不要考虑测量微秒或计算呼叫。考虑“活跃时间的百分比”。这就是堆栈样本告诉你的,如果你修复它,那大概就是你要节省的。
就这么简单。
顺便说一句,当你解决这个问题时,你会得到一个加速因子。然后,代码中的其他问题将被该因素放大,因此它们将更容易找到。通过这种方式,你可以继续前进,直到你挤出每个循环。答案 2 :(得分:0)
我告诉人们的第一件事是认识到
之间的区别1)计时例程并计算它们被调用的次数,以及
2)找到可以有效优化的代码。
对于(1),有仪器分析器。 要在(2)中取得成功,您需要一种罕见的分析器。
需要一个采样分析器对整个调用堆栈进行采样,而不仅仅是程序计数器
随机挂钟时间的样本,而不仅仅是CPU,以便捕获可能的I / O问题
您希望的样本(不是在等待用户输入时)
,为堆栈样本上显示的每行代码提供 ,包含该行的样本百分比。如果那条线不在那里,那就是可以节省的总时间的直接量度。
(我实际上是手工完成,在调试器下中断程序。)
不要因为你没有的问题而陷入困境,例如
测量精度。如果30%的调用堆栈样本中出现一行代码,则实际成本可能在30%左右的任何范围内。如果你能找到一种方法来消除它或者少用它来调用它,你就可以节省成本,即使你事先并不确切知道它的成本是什么。
抽样效率。由于您不需要时间测量的准确性,因此您不需要大量样本。即使您获得大量样本,它们也不会显着地扭曲结果,因为它们无法发现昂贵的代码行。
调用图表。他们制作漂亮的图形,但不是你需要知道的。调用图上的弧对应于最佳情况下的代码行,通常是多行,因此知道弧的成本仅在最佳情况下告知行的成本。当你需要找到的是代码行时,调用图集中在函数上。调用图包含在递归问题中,这与无关。
了解期待的内容非常重要。许多程序员使用传统的分析器,可以获得20%的改进,认为非常好,将分析器视为胜利者,然后停在那里。其他人,使用大型程序,通常可以获得20次的加速因子。 这是通过修复问题的系列来完成的,每个问题都给出了乘法加速因子。一旦探查器无法找到下一个问题,该过程就会停止。这就是为什么“足够好”还不够好。