使用XCode和仪器来提高iPhone应用程序性能

时间:2011-02-14 22:08:14

标签: iphone xcode profiling instruments

我一直在试用仪器一段时间,而且我仍然不能做以下事情(有任何明智的结果):确定或估计一个多次调用的函数的平均运行时间。

例如,如果我使用CADisplayLink以60赫兹的速度驾驶我的gameLoop,我想看看循环平均运行多长时间...... 10毫秒? 30毫秒等。

我已接近“CPU活动”仪器,但结果不一致或没有意义。时间分析器似乎很有希望,但我能得到的只是“运行时百分比”......而且我想要一个实际的运行时。

3 个答案:

答案 0 :(得分:2)

我不确定乐器是你最好的选择。仪器会对您的代码进行采样,这意味着它会影响时序(等等)。如果你想知道循环需要多长时间,那么你应该在代码中加入一些东西来计算,并保留或显示每个循环所花费的时间。

实际的运行时可以通过:

// activity starts
NSDate* startTime = [NSDate date];

// activity ends
NSLog(@"time elapsed this loop is %f", fabs([startTime timeIntervalSinceNow]));

如果你有每个循环计算的时间,那么获得平均值很容易,因为你可以将时间相加,计算循环并除以显示平均值。

当然,循环中的

会影响时间,但这会以最小的方式产生影响。

答案 1 :(得分:0)

您应该尝试使用Shark进行时间分析。

答案 2 :(得分:0)

我已经尝试了Time Profiler,但它没有为您提供方法的平均或总运行时间。它只是告诉您在录制过程中代码在方法中花费了多少时间。它告诉你你的代码花了很多时间在一个方法中,但没有告诉你是否因为该方法运行了一次并花了很长时间,或者该方法是多次被调用但运行得非常快。如果它是前者那么你应该专注于使方法更快。如果是后者,您应该让代码更少地调用该方法。你必须弄清楚它本身是什么。让循环变得更加困难的是Run Loop,其输入源可以触发定时器服务或I / O等事件。这些传递给可能是Apple的处理程序。如果Apple的一个处理程序需要很长时间,那么Time Profiler会将它显示为热点,但除非您知道该处理程序正在做什么以及为什么没有太多可以解决的问题。 Apple的内容甚至不一定从调用堆栈的末尾调用,因此您无法轻松优化。我在OpenGL ES Analyzer方面取得了更大的成功,因为它的API统计功能可以为您提供呼叫计数,总时间和OpenGL ES呼叫的平均时间。如果您没有使用OpenGL ES,则无法帮助您。