私は3つのクラスを持っていFeature
ます。クラスには、他の両方のクラスに共通する 2 つのメソッドがあり、それらを使用する必要があります。これらの両方のメソッドには、6行から10行の数行のコードが含まれています。これらのクラスとメソッドをそのままにしておいてもよいか、またはこれらの小さなメソッドを両方のクラスに配置して、別のクラスから何度も呼び出してコストがかかる可能性があることを知りたいです。効率?また、メモリの概念では、クラスから呼び出してメソッドをローカルで呼び出すとどのように役立つでしょうか? ありがとうContacstsSender
ContactsRetriever
Feature
2 に答える
一般に、同じクラスまたは別のクラスから呼び出すと、同じ仮想メソッド テーブルルックアップのコストがかかります。
詳細についてはウィキペディアの記事を参照してください。ただし、次の引用はピーターのコメントを非常によく説明しています。
さらに、JIT コンパイルが使用されていない環境では、通常、仮想関数呼び出しをインライン化できません。コンパイラはルックアップと間接呼び出しを、たとえばインライン化された各本体の条件付き実行に置き換えることができますが、そのような最適化は一般的ではありません。このオーバーヘッドを回避するために、コンパイラは通常、コンパイル時に呼び出しを解決できる場合は常に vtables の使用を避けます。
コンパイラが vtable ルックアップを最適化して排除することを認識する方法の例にはfinal
、クラスまたは関数のいずれかで修飾子を使用することが含まれます (サブクラスが機能をオーバーライドすることは不可能であるため)。
別のクラスから何度も呼び出すと、効率が低下する可能性があるため
重要なのは、メソッドの場所ではなく、メモリ内でメソッドによって使用されるパラメーターの場所です。しかし、パラメーターの場所でさえ、99% の状況ではあまり重要ではありません。
そして、メモリの概念では、それはどのように役立ちますか?
メモリに関しては、違いはありません (クラス ローダーによってロードされるクラス ファイルのサイズは別として、ここでは数百バイトで話しています)。
したがって、コードの重複を避ければ問題ありません。
最適化ではよくあることですが、アプリケーションのボトルネックは、あなたが考えている場所ではなく、プロファイラーを使用して見つける必要があります。