Objective c 减少objc_msgSend和retain/release调用
在Objective-C中调用方法/属性的性能开销正在破坏我的iOS应用程序的性能;Xcode探查器(也称为仪器)将70%的延迟归因于Objective c 减少objc_msgSend和retain/release调用,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,在Objective-C中调用方法/属性的性能开销正在破坏我的iOS应用程序的性能;Xcode探查器(也称为仪器)将70%的延迟归因于objc\u msgSend、\u retain和\u release 在我的代码中,到目前为止,我对我的XROpenGL类的实例方法renderSprite(XRSprite)进行了大约1100次调用,这是renderSprite(XRSprite,int,int,int)的重载方法,它反过来调用不少于五个其他方法,其中许多方法从XRSprite访问属性。正如你
objc\u msgSend
、\u retain
和\u release
在我的代码中,到目前为止,我对我的XROpenGL
类的实例方法renderSprite(XRSprite)
进行了大约1100次调用,这是renderSprite(XRSprite,int,int,int)
的重载方法,它反过来调用不少于五个其他方法,其中许多方法从XRSprite
访问属性。正如你所能想象的,有很多信息被发送
除了C++重写代码中的关键部分之外,我还有其他选择吗? < P>是每帧6600个调用?为了便于讨论,我假设是这样的,对于显式方法调用,总调用数为396000,每秒60帧。如果假设是悲观的情况,objc_msgSend的开销(相对于C函数调用)仍然只有O(100)个周期。因此,在一台现代设备上,您大约需要4%的CPU时间。没什么大不了的。每次调用可能会得到一个或两个保留和相应的释放,但保留/释放相对较快,所以我们再次讨论的是个位数的百分比。一般来说,这种高达10%的“运行时开销”并不令人震惊,尽管它不是最优的 所以,我要问你们的问题是:
显然,是的,你可以重写C++中的关键代码。但是对于中级绘图代码,您不必这样做;C++通常被保留到低层次的构造,比如向量和四元数以及其他这样的原语。你是指<代码> ObjcIsggsEnter()/<代码>?当方法调度变成问题时,你做的不对!实际上,我会用仪器来优化什么。通常关键是使用可变缓冲区或重用对象->因为昂贵的是分配我不同意这个问题的结束。然而,我认为这个问题需要改进。首先,
renderSprite(XRSprite)
和renderSprite(XRSprite,int,int,int)
没有在Objective-C中描述实例方法;在Objective-C中,我们不会通过在方法名称的末尾放括号来调用方法。你需要发布真实的代码。第二,如果你想谈论你的档案分析结果,发布你的档案分析结果——要么复制粘贴,要么发布一个屏幕截图。这个问题是错误的。他声称方法调度是问题所在——以我的经验来看,这只是一种症状他没有代码,也没有结果=>非常广泛+在我能够满足发布代码示例和/或分析器屏幕截图的请求之前,他不适合我。不过,我似乎已经回答完这个问题了。在Objective-C中,我的应用程序最初的性能是7FPS,经过广泛的优化(删除有利于成员变量的属性、消除方法重载、组合方法以减少消息等),我的性能达到了27fps。我认为我不可能更快地获得它(并且仍然保持一个面向对象的设计)而不切换到C++。这也不是一个答案:——只是说它和我以前的(旧的,现在删除的)答案部分相同。