4

考虑这个 Objective-C 代码(启用 ARC):

[self.aProperty sendMessage];
if (self.aProperty)
{
    [self doSomethingWithProperty:self.aProperty];
}

我想知道将代码重写为下面的片段是否会更快(在发布版本中):

MyPropertyClass* myProperty = self.aProperty;
[myProperty sendMessage];
if (myProperty)
{
    [self doSomethingWithProperty:myProperty];
}

问题是 Apple LLVM Compiler 3.0 是否能够优化对属性 getter 的重复访问?如果属性是非原子的,有什么区别吗?

如果我不得不猜测,我会说编写下面的代码更快,因为编译器不能保证 self.aProperty 在这些行中不会改变。我对吗?

4

1 回答 1

7

比原子与非原子的问题更重要的是,不能保证 getter 是纯的或幂等的。多次调用 getter 可能不等于调用一次。例如,someNSEnumerator.nextObject每次调用它都会返回不同的结果。所以这种优化在一般情况下是不可能的。

但是,关于“更快”,我怀疑任何一个代码片段都会明显更快。正确的答案是进行分析,看看这段代码是否经常运行,是否值得麻烦。

于 2012-09-28T19:02:10.040 回答