2011-07-07 9 views
23

メンバー変数を直接返すのではなく、Collections.unmodifiableList()を返すことをお勧めしました。私の同僚は、パフォーマンスの低下が懸念されています。もちろん、最良の答えはそれを測定することです。私たちはそれを行うかもしれませんが、私はあなたの経験や参考文献、プロまたは詐欺を知りたいと思います。Collections.unmodifiableListには何らかのパフォーマンスリスクがありますか?

+2

これは私を夢中にさせる、実証されていない、成熟したマイクロ最適化の一種です。同僚にこれらの回答とソースコード自体を指摘してください。 – duffymo

+0

ありがとう、Duffy;私はそれをやる。私はむしろ時間をかけて測定します(それでもなお可能です)が、これだけではなく、私にとってだけでなく、ここで明確な答えを得ることは良いことです。私は、これらの行に沿った質問が既に尋ねられ、ここでうまく答えられていると思った。私がしなかったとき - よく、私は尋ねた。 –

+1

@duffymoは完全に合意した。 @カルManasterあなたの同僚に尋ねる必要がある質問は、 'パフォーマンスは何に比べて打撃ですか?'あなたが望むなら、あなたはゼロ時間で間違った答えを得ることができます。そうではありません。 – EJP

答えて

23

号には、少なくとも、OpenJDK implementationは文字通りUnsupportedOperationException sの修正方法は、残りはちょうど コンパイラ VM(とそうであっても、1つのレベルのことで離れて最適化されるはずです間接のいずれかのレベルを、追加し、「置き換え」間接指導は費用がかからない)。

変更できないリストを返却したい場合は、パフォーマンスの影響は正確性の損失と比較して薄くなりますが、パフォーマンスだけでは避けられません。あなたが必要です。

+6

Javaコンパイラではなく、VM(Hotspot)によって最適化されています。 –

7

実装を見ると、Collections.unmodifiableは実際のコレクションを囲む単なるラッパーであり、転送する代わりにすべての削除/追加メソッドの例外をスローします。したがって、パフォーマンスヒットはありません(転送コールはJITによってインライン化されます)。

だから、元のほとんどの時間ではなく、変更不可能なコレクションを返すべきです。これはずっと優れたコーディング方法です。

3

JITが関数をインライン化する場合、そうでない場合は、[はい、わずかパフォーマンスヒットが発生しますが、おそらくないあなたが非常にタイトなループを持っている場合を除き、それをに気づくことができるようになります。

デバッグ用にコンパイルしない限り、関数をインライン化する可能性があります。

関連する問題