Apple LLVM编译器是否优化了重复的属性访问?

时间:2012-09-28 18:52:01

标签: objective-c optimization automatic-ref-counting compiler-optimization

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

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

我想知道如果将代码改写为下面的snipped会更快(在发布版本中):

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

问题是Apple LLVM编译器3.0是否能够优化对财产获取者的重复访问?如果该属性是非原子的,它会有什么不同吗?

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

1 个答案:

答案 0 :(得分:7)

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

然而,关于“更快”,我怀疑任何代码片段都会明显加快。正确的答案是分析,看看如果这个代码经常运行足以值得麻烦,它是否有任何区别。