与Objective-C中的属性相比,公共实例变量访问的速度要快多少

时间:2016-08-18 17:38:07

标签: ios objective-c performance oop properties

我的公司完成了一个新的游戏引擎(像大多数引擎一样)非常占用CPU。它是用Objective-C编写的,经常访问的大多数核心游戏项都存储在对象属性中。其中大部分是自动合成的,只需存储和阅读。

通过将核心游戏引擎项目中的属性更改为公共实例变量,我们可以获得多少速度?

因此,它将使用属性

声明和访问
@property (nonatomic) CMLocation location;
node.location.x;

现在是:

@public:
   CMLocation location
node->location->x

从逻辑上讲,我认为ivars会快得多,因为它应该是一个几乎单一的时钟节拍操作(假设没有缓存未命中),但也许编译器现在调整那种东西,合成属性也一样快。 / p>

1 个答案:

答案 0 :(得分:1)

无法回答数字,但试图在“引擎盖下”描述机制

当我们通过node->location->x访问属性时 - 它是最快的方式,只是内存中的地址查找,纯粹的c风格。

当我们通过node.location.x访问时,obj-c为属性调用getter方法,并且它不仅仅是经典函数调用 - obj-c执行objc_msgSend( node, @selector( location)),它通过字符串名称执行选择器查找。您可以在此处找到有关此流程的非常清晰的说明:https://www.mulle-kybernetik.com/artikel/Optimization/opti-3.html

因此,如果您的代码经常执行并且它是性能的瓶颈 - 是的,您应该将其重写为c-style。另外,请记住,可以直接访问struct属性,并且在重写时注意安全性 - 您不再需要nil检查。

P.S。您可以使用Instruments测量性能以找出瓶颈并优化重要的代码块 - 这是优化的明智方法。