【发布时间】:2016-12-25 17:57:14
【问题描述】:
我的公司完成了一个新的游戏引擎,它(像大多数引擎一样)是 CPU 密集型的。它是用 Objective-C 编写的,大多数经常访问的核心游戏项目都存储在对象属性中。其中大部分是自动合成的,只需存储和读取即可。
通过将核心游戏引擎项目中的属性更改为公共实例变量,我们可以获得多少速度(如果有的话)?
因此,它会像这样使用属性声明和访问
@property (nonatomic) CMLocation location;
node.location.x;
现在应该是:
@public:
CMLocation location
node->location->x
从逻辑上讲,我认为 ivars 会快得多,因为它应该是一个几乎单一的时钟滴答操作(假设没有缓存未命中),但也许编译器现在调整了这种事情并且合成属性也一样快。
【问题讨论】:
-
对其进行基准测试。如果速度可以接受,坚持属性。代码的清晰性也很重要。
-
像你这样声明的原子属性肯定会比 ivar 慢
-
谢谢,我把它改成了非原子的,因为这实际上是我们使用它的方式。
-
公共实例变量是个坏主意。不要公开内部实现细节。
-
让我觉得可能是“过早的优化”。提防为了理论优化而优化代码,牺牲代码的可维护性。当然,如果这是一个实际的瓶颈,那么就做出这种牺牲,但这里不太可能出现这种情况。如果你经常调用它以至于它确实产生了任何可观察到的影响,那么问题可能在于更广泛的设计,而不是这个访问器。但只有在更广泛的背景下审查这一点并对您的代码进行基准测试才能验证这一点。
标签: ios objective-c performance oop properties