Objective-C vs. C速度

No *_*ing 13 c objective-c ios

这可能是一个天真的问题,但无论如何我都会问.

我在iOS上使用Core Audio(C API),并将C与Objective-C混合使用.我的班级有.mm扩展名,到目前为止一切正常.

我在不同的地方读过关于Objective-C很慢的内容(没有给出太多细节 - 而且我没有做出任何声明).我理解不从Core Audio渲染回调等调用Objective-C以及原因.

另一方面,我需要调用从GUI处理Core Audio内容的类,以便在运行时进行各种调整.会有一些数组走路,主要是Core Audio使用的数据移动.通过在C中编写我的函数并将我的变量存储在例如向量而不是NSMutableArrays中,可以快速获得任何好处吗?

我只使用Objective-C/iOS几个月,所以我对此没有任何看法.

wad*_*rld 26

Objective-C比直接C函数调用稍慢,因为其动态性质涉及查找.如果没有其他人在细节中添加,我将更详细地编辑这个答案.

但是,更重要的是,您过早地进行了优化.有一个非常大的机会,Objective-C中的额外开销将会对你的应用程序的性能零显着的影响.

利用Objective-C的优势,设计出最佳的书面,最面向对象的应用程序.如果且仅当测试显示性能问题时,请优化应用程序的这些特定区域.

  • 我赞成,但我也会发表评论,强调这是多么重要.早期优化没有意义. (7认同)

Jer*_*myP 6

Objective-C的主要性能是调度方法调用所需的工作.Objective-C是动态绑定的,这意味着接收消息的对象(选择器)决定在运行时如何处理它.这是使用哈希表实现的.选择器经过哈希处理(在编译时我认为)并映射到通过哈希表调用的方法,并且需要时间来进行查找.

话虽如此,方法查找 - 发生在objc_msgSend()高度优化.事实上,它是用汇编程序手工制作的.我听说它说与C函数调用相比,开销大约是20台机器指令.通常情况下,这不是什么大问题,但是如果你正在运行100,000个元素NSArray,那么查找每个元素-objectAtIndex: 会产生相当大的开销.

然而,几乎在所有情况下,额外的灵活性和功能都是值得的.这就是为什么wadersworld的回答包含了很好的建议.

Bill Bumgarner撰写了一篇关于objc_msgSend()的精彩文章