1

今日、私が書いていないコードを使用していて、クラスにプライベートメンバーがあることに気付きましたm_privateMember。コーダーは、GetPrivateMember()のみを含むと呼ばれるメソッドも含めていましたreturn m_privateMember。このメソッドは、このスコープでアクセス可能なプライベート フィールドを単に使用するのではなく、クラス自体の中で頻繁に使用されることに注意してください。

意味的には、これには多くの問題があります。メソッド対実際のゲッター/セッターはずさんなようで、クラススコープ内にいる場合は、ゲッターではなくプライベートフィールドを実際に使用する方が良いといつも思っていました。言うまでもなく、職場のコーディング基準を満たしていないという理由だけでコードをクリーンアップするつもりですが、そうすることで何らかの形でパフォーマンスが向上するかどうか知りたいと思っていました。

単純にプライベート フィールドを返すメソッドを呼び出すと、より多くのオーバーヘッドが発生しますか?

4

2 に答える 2

2

あなたの質問に直接答えるには:場合によります。

単一のプロパティは、return private fieldそのアセンブリ内のすべての呼び出しに対して、(最適化が有効になっている場合) コンパイラによってインライン化される可能性が非常に高くなります。この場合、フィールドに直接アクセスするのと同じ操作です。

アセンブリの外部からプロパティにアクセスする呼び出しの場合、JIT コンパイラは静的コンパイラと同じ方法で呼び出しをインライン化する可能性がありますが、アセンブリによって提供されるインターフェイスを尊重する必要があるため、静的コンパイラはこれを行うことができません。 . これは、コンパイル済みのアセンブリを、パブリックな変更がなく、新しいバージョンを使用するためにアプリケーション ソースを再コンパイルする必要がない新しいバージョンに置き換えることができるようにするためです。

プロパティが複雑になるにつれて、静的コンパイラまたは JIT コンパイラによってインライン化される可能性は低くなり、プロパティは想像どおりに呼び出されます。


とはいえ、パフォーマンスの議論は本当に学術的なものです。ほとんどすべての実用的な例では、プロパティの呼び出しとプライベート フィールドの読み取りの違いは些細なことです。測定可能な唯一の時間は、非常に低スペックの組み込みシステムで実行している場合、またはシステムの各ユーザーに対して毎秒数十億回の読み取りを行っている場合です。

ほとんどのコンピューターは非常に高速であるため、実行時間がさらに 0.0000001 秒短縮される手法ではなく、コードをより保守しやすくする手法を選択する必要があります。

于 2012-12-17T15:16:26.623 に答える
1

単純にプライベート属性を返すメソッドを呼び出すと、より多くのオーバーヘッドが発生しますか?

getter メソッドと setter メソッドは get と set の実装ごとにプロパティごとに生成されるため、実際に顕著な違いはありませんが、美学と適切な使用法はここにあります。ただし、速度の点でもプロパティの使用を「より良く」するいくつかの実装要因/最適化が行われている可能性がありますが、ほとんどの場合、同等の効果に対するわずかな改善があります。

于 2012-12-17T15:04:40.360 に答える