Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 减少objc_msgSend和retain/release调用_Objective C_Ios_Cocoa Touch - Fatal编程技术网

Objective c 减少objc_msgSend和retain/release调用

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访问属性。正如你

在Objective-C中调用方法/属性的性能开销正在破坏我的iOS应用程序的性能;Xcode探查器(也称为仪器)将70%的延迟归因于
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%的“运行时开销”并不令人震惊,尽管它不是最优的

所以,我要问你们的问题是:

  • 你能发布你的代码吗
  • 您是否可以发布更详细的概要信息(例如各种前10种方法之间的确切分类,以及主要方法的调用堆栈)
  • 你确定这些时间实际上花在了objc_msgSend等人身上,而不仅仅是花在孩子身上吗
  • 你到底打了多少个电话?如测量的,不是假设的
  • 是否可以使用ivar而不是@properties来删除一些方法调用
  • 沿着这些思路,在一个方法中多次使用属性时,您是否正在缓存要访问的属性
  • 您能否重构以减少方法调用的数量,和/或在某些方面使用普通的C函数

  • 显然,是的,你可以重写C++中的关键代码。但是对于中级绘图代码,您不必这样做;C++通常被保留到低层次的构造,比如向量和四元数以及其他这样的原语。

    你是指<代码> ObjcIsggsEnter()/<代码>?当方法调度变成问题时,你做的不对!实际上,我会用仪器来优化什么。通常关键是使用可变缓冲区或重用对象->因为昂贵的是分配我不同意这个问题的结束。然而,我认为这个问题需要改进。首先,
    renderSprite(XRSprite)
    renderSprite(XRSprite,int,int,int)
    没有在Objective-C中描述实例方法;在Objective-C中,我们不会通过在方法名称的末尾放括号来调用方法。你需要发布真实的代码。第二,如果你想谈论你的档案分析结果,发布你的档案分析结果——要么复制粘贴,要么发布一个屏幕截图。这个问题是错误的。他声称方法调度是问题所在——以我的经验来看,这只是一种症状他没有代码,也没有结果=>非常广泛+在我能够满足发布代码示例和/或分析器屏幕截图的请求之前,他不适合我。不过,我似乎已经回答完这个问题了。在Objective-C中,我的应用程序最初的性能是7FPS,经过广泛的优化(删除有利于成员变量的属性、消除方法重载、组合方法以减少消息等),我的性能达到了27fps。我认为我不可能更快地获得它(并且仍然保持一个面向对象的设计)而不切换到C++。这也不是一个答案:——只是说它和我以前的(旧的,现在删除的)答案部分相同。