C代码运行得更快吗?

时间:2012-03-07 16:55:32

标签: iphone objective-c c performance

从Objective-C调用C代码是否有任何性能提升?

我已经读过某个地方,与使用函数调用的其他语言相比,消息传递速度较慢。因此,如果我从Objective-C代码调用C函数,我是否避免了消息传递开销?

在优化性能时,是否建议练习使用C编写最关键的函数和过程,而不是使用Objective-C对象?

编辑:
鉴于有关过早优化和代码可读性的答案数量,我想澄清一点,我没有考虑常规应用程序,而是非常具体的应用程序,如:

  • 图形
  • 加密或压缩算法。
  • 数学

通常,函数或过程不需要OO设计,并且打算使用参数多次调用。

5 个答案:

答案 0 :(得分:11)

您编写的代码非常不可能完全符合消息发送的瓶颈。以对您最有意义的方式编写代码,然后使用Instruments来分析和优化(如有必要)。几乎可以肯定,如果你的代码很慢,那将是由于比消息发送更高级别的问题。

答案 1 :(得分:8)

这是一个benchmark,它将消息传递与调用C函数进行比较。以下是调用斐波那契函数的不同实现大约14亿次的结果。

Message Passing 23.495 seconds
IMP Calling     16.033 seconds
C Function      9.709 seconds

所以是的,调用Objective C方法时会有一些开销。但是,除了在某些情况下,这不会影响您的应用程序的性能。实际上,消息传递仍然比most other operations更有效,例如浮点除法。

此外,大多数应用程序花费大部分时间等待用户输入,下载数据等。

答案 2 :(得分:4)

是的,建议使用编写良好的普通C而不是在性能关键的内部循环中使用Objective C,例如实时音频信号处理或图像处理代码。在每帧时间处理数千个单独的音频样本或数百万个图像像素时,使用对象数据类型或消息传递很少有任何好处。所有不需要的方法调度周期只会浪费用户的电池寿命。其他类型的复杂数值模拟和有限元模型(等)也可能从保持内部循环简单以获得编译器优化器的最佳结果中受益。

然而,只需要以人的速度每次事件发生几次的更高级别的东西可能不会消耗足够的消息传递开销周期以便可测量。因此,任何提高代码可读性和重用的抽象都不太可能使用户失去任何性能或电池寿命。

答案 3 :(得分:1)

初始消息在运行时被解释,因此比C ++虚拟方法调用(它本身比直接调用稍慢)长约三倍。然而,后续调用是IMP缓存的,并且在大多数实现中比C ++虚方法调用更快,但仍然比直接函数调用稍慢(在C或C ++中)。

所以,是的,可能会有性能提升,但在失去Objective-C的所有好处之前,您应该确保“优化”的好处是显着的。在大多数情况下,可以在其他地方获得更大的性能例如,通过采用合适的数据结构和算法。大多数代码都花费时间来处理函数调用开销 - YMMV。

请参阅Objective C message dispatch mechanism

答案 4 :(得分:1)

直接C函数调用总是比调用Obj-C方法更快;但是,正如许多人所指出的那样,除了性能敏感的代码之外,它不太可能成为瓶颈。

但是你可以转过来问为什么使用方法,如果它慢? - 反对“过早优化”的法令并不意味着“故意编写糟糕的代码”。

它的平衡和是否使用方法或函数之间的界限是模糊的,你必须做出选择。两个可能有帮助的终点:

  1. 如果代码要改变对象的状态 - 请使用方法。
  2. 如果代码是自然函数;接受一些输入,产生输出,不操纵状态(具有“副作用”);那么一个功能是有道理的。
  3. 中间的所有要点都要用你自己的判断。

    例如,如果某个类中的代码需要计算多个位置中金字塔的体积,则会抽象出体积算法:方法或函数?函数 - 它需要一些值,产生一个值,不会改变对象状态。也许更好的是使它成为一个static函数,它有效地使它成为类的私有,并且不会污染您的应用程序命名空间。将这样的算法编写为一种方法如果它只是在类内部需要它是没有好处的 - 我会说这是“糟糕的代码”(但这是一个意见!)< / p>