繁体   English   中英

Objective-C与C的速度

[英]Objective-C vs. C speed

这可能是一个幼稚的问题,但是我还是会问。

我正在使用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一起工作了几个月,所以对此我没有任何看法。

由于其动态特性涉及到查找,因此Objective-C的速度比直接C函数的调用略慢。 如果没有其他人添加细节,我将在以后更详细地编辑此答案。

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

利用Objective-C的优势设计最佳的书面形式,最面向对象的应用程序。 当且仅当测试显示性能问题时,才能优化应用程序的那些特定区域。

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

话虽如此,在objc_msgSend()中进行的方法查找已得到高度优化。 实际上,它是在装配工中手工制作的。 我听说它说与C函数调用相比,开销约为20条机器指令。 通常,这没什么大不了的,但是如果您要遍历100,000个元素NSArray ,请使用-objectAtIndex:查找每个元素,这将导致相当大的开销。

但是,在几乎每种情况下,值得付出的额外灵活性和功能性。 这就是为什么wadersworld的答案包含很好的建议的原因。

Bill Bumgarner 在objc_msgSend()上写了一系列很棒的文章

慢是相对的。

与访问最内部循环中的许多小数据类型元素(大图像位图中的每个像素或整首歌曲中的每个音频样本)相比,Objective C消息传递速度较慢 与以UI甚至显示刷新事件的速度执行任何操作相比,Objective C确实非常

要处理Core Audio原始样本,请坚持使用C。要处理与UI相关的Core Audio事件(停止,开始,属性等),将它们封装在Objective C中不会产生任何可测量的速度差异。

尽管其他答案已量化为动态方法分派(objc_msgSend),这是手工调试的程序集,它增加了大约20条机器指令,但与C相比,Objective-C的性能较差的另一个可能原因是:Objective-C的基础库更丰富。

一个这样的性能比较使游戏产生了地形,如下所示:

  • 纯C版本提供60 fps
  • Objective-C版本提供39 fps

速度变慢的原因是所使用的NSMutableArray包括各种安全检查,并且能够增长和缩小到所需的大小,而C数组的大小是固定的-如果需要,可以继续写并超越界限,只是准备好发生坏事。

幸运的是,正如其他人所说,在以后进行性能分析并在需要计数的地方交换一些纯C代码非常容易。

Objective-C并不慢,它实际上是带有对象的C。

Objective-C中的类包含一些不同的东西:

  • 选择器到函数的映射(方法实现)
  • 名称到类型的映射(实例变量)
  • 名称到类型和函数(属性)的映射

因此,Objective-C的速度与您自己调用原始C函数的速度差不多,而查找函数的开销却很小。

目标c与c一样快,因为没有目标C编译器,并且所有目标C代码都使用结构和函数指针解析为C。 目标C是我们可以用C编写面向对象编程的方式。面向对象编程语言的所有功能(目标C中的小讲说)都是使用C编写的。实际上,我们可以使用结构(可以具有一个类的实例变量)和操作该数据的相关函数。 消息传递或调用对象功能是通过使用该功能完成的

objc_msgSend(receiver,selector,arg1,arg2....)

那就是C,Objective C处理器提供了ObjectiveC。当我们编译Objective C代码时,它将转换为纯C,然后编译并运行C代码。 C和目标C的区别是速度。

这完全取决于您在做什么。 无论如何,使用核心音频,您99%的执行时间都应该花在库函数上。 现在,如果您做一些愚蠢的事情-花费一秒钟的样本,将每个样本转换为一个NSNumber,将其存储到NSMutableArray中,并通过调用[[myArray objectAtIndex:i] doubleValue]进行手写FFT,您将得到应得的。 最慢的iPhone每秒可以执行很多方法调用。

无论您使用C函数还是Objective-C方法都没有什么不同。 唯一的区别是您调用了多少个Objective-C方法。 很多微小的Objective-C方法被称为百万次,这是很大的开销。 而且没有法律禁止在Objective-C代码中使用C数组。

加快速度的规则:使用仪器。 测量执行时间。 选择执行时间较长的地方,加快执行速度,然后重新测量。 在大多数情况下,您不会通过用更好的代码替换好的代码,而是通过用合理的好的代码替换笨拙的代码来获得加速。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM