2

クラスの外部からivarにアクセスするためのプロパティを使用してクラスを定義できます。

myInst-> ivar構文を使用して、C構造体でアクセスすることもできます。

C ++ではアクセサーを使用しますが、Objective-Cでは直接アクセスしたい場合があります。メッセージはC++メソッドの場合のようにインライン化されていないため、メッセージングシステムでは、一部のコンテキストで重要なアクセサーで大きなパフォーマンスヒットが発生します。

たとえば、スカラーと呼ばれるivarとそれに定義されたプロパティを持つクラスで。スカラーは単純なfloat値です。

-(void) doWorkWithMyClass:(MyClass*)myinst
{
   // array and other locals declaration omitted 
   for (int i = 0; i < reallyBigX; i++) {
      result += [myinst scalar] * array[i];
      [myinst computeNextScalar:i];
   }
}

[myinstscalar]をmyinst->scalarに変更すると、アクセサーで呼び出しを使用するとこのループでCPUの大部分が使用されるため、メソッドの実行速度が大幅に向上します。

C ++と同様に、ivarへの直接アクセスは一般的に推奨されていないことを理解していますが、このコンテキストでは、速度が重要な場合、それは許容されますか?そうでない場合でも、objective-cクラスを使用するより好ましいメソッドはありますか?

4

2 に答える 2

6

パフォーマンスに大きな影響を与えると、多くのことが受け入れられるようになりますが、あなたが提供している例では、はるかに優れたソリューションがあるようです。

まず、なぜ[myinst computeNextScalar:i]新しいスカラーを返さないのですか?そうすれば、それをフェッチする必要はなく、すべてがはるかに高速になります。

作品を移すことができませんmyinstか?つまり、次のようなものを作成することはできません。

result = [myinst totalOverArray:array];

reallyBigXが本当に大きい場合は、ここでAccelerate.frameworkを検討する必要があります。それはあなたがしているように見える種類の操作のパフォーマンスを大幅に改善することができます。(Accelerateフレームワークを使用してパフォーマンステストを実行する必要があります。一部の操作では大幅に遅くなる可能性がありますが、これは速い場合があります。)

最後に、Objective-Cget...パターンについて考えてみましょう。次のようになります。

int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
   result += scalars[i] * array[i];
}
free(scalars);

vDSP_dotpr()ところで、パフォーマンステストを行う必要がありますが、上記は間違いなくの候補です。多くの場合、vDSPstride = 1の場合、単純なループは同等の呼び出しよりも高速です(ではなく単純な増分を使用できるため+= stride)。

于 2012-02-20T00:42:24.237 に答える
1

はい、許容されます。、、などの@publicアクセス@private修飾子は、クラス外からivarにアクセスする必要がある設計をサポートするために部分的に導入されました。ただし、ivarに直接書き込むことは避けてください。

于 2012-02-19T23:45:42.053 に答える