Iphone C代码运行得更快吗?

Iphone C代码运行得更快吗?,iphone,objective-c,c,performance,Iphone,Objective C,C,Performance,从Objective-C调用C代码是否有性能提升 我在某个地方读到,与使用函数调用的其他语言相比,消息传递速度较慢。因此,如果我从Objective-C代码调用C函数,是否可以避免消息传递开销 在优化性能时,是否建议使用C语言编写最关键的函数和过程,而不是使用Objective-C对象 编辑: 鉴于大量答案警告过早优化和代码可读性,我想澄清一下,我不是在考虑常规应用程序,而是非常具体的应用程序,例如: 图形 加密或压缩算法 数学 一般来说,不需要OO设计的函数或过程,可以使用参数多次调用 您

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

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

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

编辑:
鉴于大量答案警告过早优化和代码可读性,我想澄清一下,我不是在考虑常规应用程序,而是非常具体的应用程序,例如:

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

一般来说,不需要OO设计的函数或过程,可以使用参数多次调用

您编写的代码不太可能对瓶颈进行了充分的优化,从而成为消息发送的瓶颈。以对您最有意义的方式编写代码,然后在必要时使用工具进行分析和优化。几乎可以肯定的是,如果你的代码慢了,这将是因为比消息发送更高层次的问题。

< P>在运行时解释初始消息,这样的花费比C++虚拟方法调用的时间长大约三倍(这比直接调用慢一些)。然而,后续调用是IpkCurror,并且在大多数实现中,它比C++虚拟方法调用快,但仍然比直接函数调用(C或C++)略微慢。 因此,是的,可能会有性能提升,但在失去Objective-C的所有好处之前,您应该确保“优化”的好处是显著的。在大多数情况下,在其他地方可以获得更大的性能优势;例如,通过采用合适的数据结构和算法。大多数代码将时间花在函数调用开销上——YMMV

请参见

这是一个比较消息传递和调用C函数的方法。下面是调用fibonacci函数的不同实现约14亿次的结果

Message Passing 23.495 seconds
IMP Calling     16.033 seconds
C Function      9.709 seconds
是的,调用Objective C方法时会有一些开销。但是,除非在某些情况下,否则这不会影响应用程序的性能。事实上,消息传递仍然比浮点除法更有效


此外,大多数应用程序花在等待用户输入、下载数据等方面的时间最多。

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

但是,您可以扭转这种情况,并询问如果某个方法速度较慢,为什么要使用该方法?-反对“过早优化”的法令并不意味着“故意编写糟糕的代码”

这是一种平衡,使用方法还是函数之间的界限是模糊的,你必须做出选择。可能有帮助的两个端点:

  • 如果代码要改变对象的状态,请使用方法
  • 如果代码是自然函数;接受一些输入,产生输出,不操纵状态(有“副作用”);那么函数就有意义了
  • 对于两者之间的所有点,请使用您自己的判断


    例如,如果类中有一个代码需要在多个位置计算棱锥体的体积,那么可以抽象出体积算法:方法还是函数?函数-它接受一些值,生成一个值,不改变对象状态。也许更好的方法是将其设置为
    静态
    函数,这样可以有效地使其成为类的私有函数,并且不会污染应用程序的名称空间。如果只在类内部需要这样一个算法,那么将其作为一种方法来编写是没有好处的——我认为这样做是“糟糕的代码”(但这是一种观点!)

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


    然而,更高级别的事情,如果每个事件只需要以人的速度发生几次,可能不会消耗足够的消息传递开销周期来进行测量。因此,任何旨在提高代码可读性和重用性的抽象都不太可能影响用户的性能或电池寿命。

    OpenGL ES是用C编写的,不是吗?这是我所说的代码类型的一个很好的例子。过早优化是OpenGL传统上使用C语言的所有弊端的根源,但在许多面向对象语言中都有包装器,包括Objective-C,它们的性能很好。更重要的是你希望你的代码看起来像什么,而不是你希望它运行多快。对于许多应用程序类型,需要对应用程序的算法和数据类型进行早期智能优化,以接近可用的实时响应或帧速率。虽然避免过早优化的原则是正确的,在实际产品中,有许多情况下,消息传递是一项重要的开销,应该加以处理。您应该强烈避免在被调用数千次或更多次的紧密循环中传递消息。与方法不同的是,可以内联一个小函数,有时表现出显著的性能增益(特别是当编译器可以应用二次优化时)。你不应该过早地进行优化,这是正确的,但这并不意味着不需要考虑消息发送。谢谢,我正准备制定自己的基准。