2012-02-19 4 views
2

クラスの外側から私のivarsにアクセスするためのプロパティを持つクラスを定義できます。効率のためにクラスの外部から直接ivarアクセス​​を使用することは可能ですか?

私もちょうどmyInst-> IVAR構文C-構造体の形でアクセスするために使用することができます。 C++で

、私はアクセサとなるだろうが、Objective-Cで、私は直接アクセスしたい場合があり、いくつかのケースがあります。メッセージングシステムは、C++メソッドのようにインライン化されていないため、いくつかのコンテキストで重要なアクセッサのパフォーマンスが大幅に低下します。

たとえば、スカラーと呼ばれるivarとプロパティが定義されたクラスでは、この中にCPUのほとんどを取るでしょうアクセサを呼び出しを使用しているので、i>はスカラーをmyinst-する[MYINSTスカラー]を変更する場合は、この方法はより速く多くのことを実行します

-(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]; 
    } 
} 

:スカラーは、単純なfloat値でありますループ。

C++、私が直接IVARのアクセスは、一般的に推奨されて理解しますが、この文脈では、スピードの問題と同じように、それが許容できるのですか?そうでなければ、依然としてobjective-cクラスを使用するより好ましいメソッドがありますか?

+1

通常、CまたはC++で直接パフォーマンスを重視する部分を実行します。 –

+1

アクセサーを使用すると、どの程度パフォーマンスが低下しますか?あなたは "大きなパフォーマンスのヒット"を定量化しましたか、ivarに直接アクセスするのがどれほど早いか、この先制的な仮定ですか? –

+0

@GeorgFritzscheはい、私はこれを通常行いますが、これは多態性、NSCoding、およびrefsをstruct/C++クラスとobj-cクラスに分割するのではなく、1つのクラスインターフェイス内でカウントしたいときにポップアップしたケースです。 –

答えて

6

多くのものは、それがパフォーマンスに大きな影響を持っていたときに受け付けられるようになり、しかし、あなたが与えている例では、より良い解決策があるように思われます。

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

は仕事がmyinstに移動することができませんか? reallyBigXは本当に大きなであれば、あなたはここにAccelerate.frameworkを検討すべきである

result = [myinst totalOverArray:array]; 

:私はあなたのようなものを作成することはできません、意味します。あなたがやっているような操作のパフォーマンスを大幅に向上させることができます。 (Accelerateフレームワークでパフォーマンステストを行う必要がありますが、一部のオペレーションではかなり遅くなる可能性がありますが)。それは次のようになります。あなたはそれをパフォーマンス・テストする必要がありますけれども

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()の候補です。多くの場合、単純なループは、stride = 1の場合(+= strideではなく単純な増分を使用できるため)同等のvDSPコールよりも高速です。

+1

これらはすべて素晴らしい謝礼です。ありがとうございます。したがって、このようなことにobj-cを使用する場合は、最初のアプローチとして、メッセージングのボトルネックをもっと長くすることができるかどうかを確認してください。他の最適化手法も興味深いですね。 –

+0

"obj-cをこの種のものに使うつもりなら、最初のアプローチとして、メッセージングのボトルネックをもっと長い塊に分けることができるかどうかを見てください。 - まったく。 –

+0

私は、配列(totalOverArray)に機能を移動しようとしましたが、doWorkWithMyClassがポリモーピッドで動作が各クラスによって異なるため、これは私のケースではうまくいかないことに気付きました。だから私はgetScalarsメソッドを使うつもりです。 –

1

はい、可能です:@public@privateなどのアクセス修飾子は、クラス外からのivarsへのアクセスが必要なデザインをサポートするために部分的に導入されました。しかし、あなたは直接ivarsに書くことを避けるべきです。

関連する問題