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

Ios 与Objective-C中的属性相比,公共实例变量访问要快多少,ios,objective-c,performance,oop,properties,Ios,Objective C,Performance,Oop,Properties,我的公司完成了一个新的游戏引擎(像大多数引擎一样)是非常CPU密集型。它是用Objective-C编写的,大多数经常访问的核心游戏项目都存储在对象属性中。其中大部分都是自动合成的,并简单地存储和读取 通过将核心游戏引擎项目中的属性更改为公共实例变量,我们将获得多大的速度(如果有的话) 因此,尽管它会像这样用一个属性声明和访问 @property (nonatomic) CMLocation location; node.location.x; 现在是: @public: CMLocati

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

通过将核心游戏引擎项目中的属性更改为公共实例变量,我们将获得多大的速度(如果有的话)

因此,尽管它会像这样用一个属性声明和访问

@property (nonatomic) CMLocation location;
node.location.x;
现在是:

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

从逻辑上讲,我认为ivars会快得多,因为它应该是一个几乎单一的时钟滴答操作(假设没有缓存丢失),但也许编译器现在可以调整这类事情,合成属性也同样快。

不能用数字来回答,但试着描述“隐藏”的机制

当我们通过
节点->位置->x
访问属性时,这是最快的方式,只需在内存中查找地址,纯c风格

当我们通过
node.location.x
访问时,obj-c调用属性的getter方法,这不仅仅是经典的函数调用-obj-c执行
objc_msgSend(node,@selector(location))
,它通过字符串名执行选择器查找。您可以在此处找到关于此过程的非常清晰的描述:

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


另外,您可以使用工具测量性能以发现瓶颈,并优化重要的代码块,这是一种明智的优化方法。

对其进行基准测试。如果速度可以接受,请坚持使用属性。代码的清晰性也很重要。像您所声明的原子属性肯定会比ivarThanks慢,我将它改为非原子属性,因为这实际上就是我们使用它的方式。公共实例变量是个坏主意。不要公开内部实现细节。我认为这可能是“过早优化”。要小心为理论优化而优化代码,这会牺牲代码的可维护性。当然,如果这是一个实际的瓶颈,那么就做出这个牺牲,但这里不太可能出现这种情况。如果你经常调用它,它确实有任何明显的影响,那么问题可能在于更广泛的设计,而不是这个访问器。但是,只有在更广泛的背景下审查这一点,并对代码进行基准测试,才能验证这一点。