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 がプロパティ ゲッターへの繰り返しアクセスを最適化できるかどうかです。プロパティが非アトミックである場合、違いはありますか?

推測する必要がある場合は、以下のコードを記述した方が高速であると言えます。これは、これらの行で self.aProperty が変更されないという保証がコンパイラにないためです。私は正しいですか?

4

1 に答える 1

7

アトミックと非アトミックの問題よりも重要なのは、ゲッターが純粋またはべき等であることが保証されていないことです。ゲッターを複数回呼び出すことは、1回呼び出すことと同じではない場合があります。たとえば、someNSEnumerator.nextObjectを呼び出すたびに異なる結果が返されます。したがって、このような最適化は一般的なケースでは不可能です。

ただし、「より高速」に関しては、どちらのコードスニペットもかなり高速になるとは思えません。正解は、プロファイルを作成して、このコードが問題を起こすのに十分な頻度で実行されているかどうかに違いがあるかどうかを確認することです。

于 2012-09-28T19:02:10.040 に答える