2012-12-24 39 views
0

在Objective-C中调用方法/属性的性能开销正在破坏我的iOS应用程序的性能; Xcode分析器(aka,Instruments)将延迟的70%归因于objc_msgSend,_retain_release减少objc_msgSend并保留/释放调用

在我的代码,到目前为止,我让约1100打到我类的实例方法renderSprite(XRSprite)这是renderSprite(XRSprite,int,int,int)一个重载的方法,依次调用不少于五种方法,其中许多来自XRSprite访问性能。正如你可以想象的那样,有很多消息被发送。

除了用C++重写代码的关键部分外,我还有其他选择吗?

+1

你的意思是'objc_msgSend()'? – 2012-12-24 12:04:03

+0

**当调度方法成为问题时,你做错了!**真的 我会用仪器看什么要优化。通常关键是使用mutableBuffers或重用对象 - > **,因为什么是昂贵的分配** –

+0

我不同意这个问题的结束。不过,我认为这个问题需要一些改进。首先,'renderSprite(XRSprite)'和'renderSprite(XRSprite,int,int,int)'不会描述Objective-C中的实例方法;在Objective-C中,我们不会通过将方括号放在方法名称末尾来调用方法。你需要发布真实的代码。其次,如果您想谈谈您的分析器结果,请发布您的分析器结果 - 无论是通过copy'n'paste还是张贴屏幕截图。 –

回答

2

每帧有6,600个呼叫吗?为了讨论的缘故,我将假设为60 FPS,总计呼叫数为396,000,仅用于您的显式方法调用。如果您认为悲观的情况,objc_msgSend的开销(与C函数调用相比)仍然只有O(100)个周期。所以在一个现代的iDevice上,你的CPU时间约为4%,非常粗略。没什么大不了的。您可能会为每个电话获得一个保留或两个相应的发行版,但保留/发布速度相对较快,因此我们仍然会说单个数字的百分比。一般来说,这种高达10%的“运行时间开销”并不被认为是过分的,尽管它并不是最优的。

所以,我对你的问题是:

  1. 您可以发布您的代码?
  2. 你可以发布更详细的配置文件信息(例如前10种方法之间的确切分解,也可能是主要的调用堆栈)?
  3. 你确定这段时间实际上是在objc_msgSend等人中度过的,而不仅仅是在它的孩子身上?
  4. 你真的打了多少电话?在测量中,没有假设。
  5. 您可以使用ivars而不是@properties来删除一些方法调用吗?
  6. 沿着这些路线,您是否缓存了您在一种方法中多次使用它们时所访问的属性?
  7. 你可以重构减少方法调用的次数,和/或使用香草C函数的一些东西?

显然是的,你可以用C++重写关键代码。但对于中级绘图代码,你不应该这样做; C++通常留给低级构造,如向量和四元数以及其他这样的基元。

+0

这不是一个答案要么:) - 只是说它是部分相同的我的(旧的,现在删除)答案 –