2012-03-26 6 views
2

私はクラスで何度も使用している変数を持っています。速度が重要なので、最も速い方法を使いたいと思います。Java - オブジェクトのgetメソッドをローカルオブジェクトを使用するよりも遅く呼び出すか?

modifyValue(User.getSession().getSessionValue()); 

と、いくつかの異なる場所で変数を使用するときに

private String sessionValue; 
sessionValue = User.getSession().getSessionValue(); 
modifyValue(sessionValue); 

などのローカル値に情報を設定する:

使っ間の速度の違いはありますか?どちらが優れたスタイルですか、理解しやすいですか?上記の例が現在、既存のコードで使用されている場合は、リファクタリングに時間を割く価値がありますか?

+0

コンパイル時の変更にわずかな違いがあります。 命名変数は再利用とコード保守性に役立ちます –

答えて

9

私はスピードの違いがあるとは思わない。これはあなたを迷子にしてしまうようなマイクロ最適化の一種です。

正しく同期されていない場合は、書き込み可能なプライベートメンバー変数にスレッドの安全性の問題がある可能性があります。

不要な書き込み可能状態を避けるため、最初の方が好きです。明らかに、少し速く倍になり

modifyValue(User.getSession().getSessionValue()); 


を使用して

1


コンパイル時間は実行時よりも高速です。
小さなプログラムでは
ですが、コードの保守性を考慮すると、変数を使用すると長時間実行に役立つかもしれない

+0

この場合、これは「少し速く」なる可能性がありますか?シナリオ1で – Jayan

+0

を使用すると、コンパイル時間が少し遅くなる可能性があります。 ご覧のとおり、バイトコードie。最終出力は両方の場合で同じです! –

+0

バイトコードが同じであれば、JITのコンパイル時間と一般的なランタイムは同じになります。私はOPが 'javac'のコンパイル時間について質問しているとは思わない。たとえ彼がいたとしても、コンパイルの時間差は非常に小さく、測定することは非常に困難です。 –

1

各メソッド呼び出しには時間がかかります。したがって、オブジェクトをメンバフィールドに参照すると、メソッドを呼び出すときに発生する操作の数が減り、理論的には速度が向上します。

しかし、この種の最適化について考えてみると、ソフトウェア開発者の間違いとしてよく知られている「Premature optimization」という名前が付けられています。それを避けてください。

1

いいえ、それは遅くはありません。コンパイラとJVMのジャストインタイムコンパイラは最適化を行い、同じにする必要があります。しかし、それはコードの品質/可読性の問題です。いくつかのメソッド呼び出しで大きなone-linersを書くと、コードは読みにくくなります。

0

ほとんどの用途で、2つは速度に関して同等です。

メンテナンス性に関して、私はローカル(final)変数に値を格納するほうが簡単です。

データの安全性に関しては、中間メソッドが決してnullの値にならないことをコードが確信できないため、あなたの説明を考えれば、それをローカル変数に格納するようアドバイスします。どこでもgetSession()の値です。

2

パフォーマンスの最適化は実際にはコードを推論するのではなく、測定値に基づいて正確に行うことができます。

文をマイクロ最適化しようとするのに時間を費やすのが本当に価値があるのか​​どうか、自分に尋ねるべきです。はるかに良いアプローチは、最初に動作するコードを記述し、次にプロファイラを使用してパフォーマンスのボトルネックが何であるかを判断することです。その後、それらの改善に焦点を当てます。マイクロ最適化ステートメントを試してみると、ほとんど何も得られません。ですから、私はマイクロ最適化の心配を止めることをお勧めします。プロファイラが示す場所に対する基本的な最適化作業はボトルネックです。

OracleのJVMとJITは、実行時に多くの洗練された最適化を行います。たとえば、単純なゲッターメソッドへのメソッド呼び出しは、ほとんどインライン展開されているため、メソッド呼び出しは必要ありません。あなたの質問にある2つのコードの間には、おそらく全く違いはないでしょう。それらはJITによっておそらくまったく同じコードに最適化されます。

関連する問題