代码之家  ›  专栏  ›  技术社区  ›  U62

目标C中的消息发送成本

  •  5
  • U62  · 技术社区  · 15 年前

    我很想知道在各种情况下,Objective-C中消息发送的成本。特别是我想指导我对程序设计的选择,这样我就不会因为避免消息发送而过早地进行优化,因为消息发送会使设计变得更好。

    我当前项目中的一个例子是,我有一个带有实例变量的类:offsetx和offsety。我经常需要绝对偏移量,现在我的代码行遍布各地:

    int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) + 
                     ((offsetY < 0.0) ? -offsetY : offsetY);
    

    现在,如果这是C++,我将创建一个内联函数,返回ABSFFSET的值。即使在爪哇/ C中,我也可以定义这样的函数作为最终的/密封的,并且非常肯定它是内联的。

    目标C是:

    -(int)absOffset {
        return ((offsetX < 0.0) ? -offsetX : offsetX) + 
                ((offsetY < 0.0) ? -offsetY : offsetY);
    }
    

    我会这样称呼它:

    int ao = [self absOffset];
    

    现在,编译器能够内联它吗?我假设它至少能够将其修复为直接的函数调用,并且避免(我假设)由于它的类型系统而必须使用的动态消息调度。

    而且,一般来说,在Objective-C中,消息调度的成本是多少?当通过“id”调用与指向具体类的指针调用时,它是否不同?

    2 回复  |  直到 15 年前
        1
  •  14
  •   Zifre    15 年前

    Objective C messages are very fast. 速度与C++虚拟方法调用相当,虽然不是很快。避免消息传递是 一定地 过早优化。您可能不想在一个内部循环中做很多工作,但是您选择的算法和其他因素将对代码的速度有更大的影响。如果速度太慢,使用分析器从那里开始。

        2
  •  5
  •   philsquared    15 年前

    首先,我将使用C函数fabs()。对于为小助手编写简单的、内联的C函数的其他事情,可以很好地工作。为方便而不是谨慎的行为而使用方法可能是不良设计的标志。性能还没有进入。

    接下来,编译器无法优化方法调用。它是一种动态语言,只有在运行时才能解析调用。各种各样的Objective-C技术可以击败编译器的任何尝试。

    在运行时,对“id”调用方法和对类型化指针调用方法没有区别——它们执行的机制完全相同。

    最后,如果在测量之前考虑性能特征,那么您已经过早地进行了优化。那不是说那是 从未 正如有些人可能相信的那样,这是恰当的,但它通常是正确的。在这种情况下,我认为,如果你把设计放在第一位,你最终可能会得到一个足够好的性能配置文件。稍后根据需要进行测量和优化。