どちらがより良いコーディング方法ですか?
読みやすさに関しては議論の余地がありますが、ほとんど違いはありません。
堅牢性に関してC
は、より優れています。以下 (最後) を参照してください。ただし、多くの場合、これらのシナリオを除外できます。
パフォーマンス (これはあなたが実際に求めていることです) に関しては、答えはプラットフォームに依存するということです。による:
- コードをコンパイルしているか解釈しているかに関係なく、
- そのコードが実際にコンパイルされるかどうかにかかわらず、JIT コンパイルしている場合、および
- コンパイラ/オプティマイザの品質、および効果的に最適化する能力。
確認する唯一の方法は、有効なマイクロ ベンチマークを作成し、関心のある特定のプラットフォームを使用して実際にパフォーマンスをテストすることです。
(またgetX()
、仮想呼び出しが必要かどうか、つまりgetX()
メソッドをオーバーライドする X のサブクラスであるかどうかにも依存します。)
ただし、次のように予測します。
- JIT コンパイルが有効になっている Java Hotspot システムでは、JIT は getX() 呼び出しをインライン化します (仮想呼び出しの問題をモジュロします)。
- 初期の Davlik VM では、JIT コンパイラは呼び出しをインライン化しません。
- 最近の Davlik VM では、JIT コンパイラが呼び出しをインライン化します。
(最後の予測は、Davlik コンパイラ担当者の 1 人からのこの回答に基づいています ... )
コードを事前にマイクロ最適化することは、一般的には悪い考えです。
- ほとんどの場合、マイクロ最適化は時間の無駄になります。このコードが頻繁に実行されない限り、パフォーマンスの違いはほとんど目立たないでしょう。
- 残りの時間の一部では、マイクロ最適化は効果がありません...または実際に事態を悪化させます1。
- マイクロ最適化がプラットフォームの 1 つの世代で機能したとしても、それ以降のバージョンでの JIT コンパイラの変更により、マイクロ最適化が無効になるか、さらに悪化する可能性があります。
1 - Sun のコンパイラ担当者から、「巧妙なマイクロ最適化」によって、オプティマイザが有用な最適化が可能であることを実際に検出できなくなる可能性があるというアドバイスを見たことがあります。これはおそらくこの例には当てはまりませんが...
最後に、 とが同等のコードB
ではない状況があることに注意してください。C
頭に浮かぶ状況の 1 つは、誰かがメソッドに隠れた副作用があるサブクラスを作成した場合A
ですgetX
。たとえば、呼び出しgetX
によってイベントが発行される場合や、呼び出しカウンターがインクリメントされる場合などです。