2012-11-19 6 views
9

私は文書を読んで処理したいと思っています。各繰り返しは1つのドキュメントを処理します。インスタンスと反復。どちらがいいですか?

どのコードが優れていますか?

1.

BufferedReader br; 
for(File f : files) 
{ 
    br = new BufferedReader(......); 
    ...... 
} 

2.

for(File f : files) 
{ 
    BufferedReader br = new BufferedReader(......); 
    ...... 
} 

私のポイントは、スペースや速度の点でより効率的であるものですか?

+1

@FedericoCristinaヘッダ更新(Y) –

答えて

3

別の場所で変数brを使用しない場合は、まったく同じです。

ナノ最適化を試みるのに時間を浪費しないように注意してください。バイトコードが異なっていても、JITはそれを最適化するときにそれほど悪くはありません。ブロックが使用されるブロックの前に変数を宣言する必要はありません。また、ブロックが使用されているものが明確でないため、使用しないでください。

11

後者は私の考えではっきりしています。一般に、可能な限り小さなスコープでローカル変数を宣言し、理想的には宣言の時点でそれらを初期化することをお勧めします。

それは直接は、パフォーマンスに影響を与えないます - あなたはパフォーマンスに影響します変更を加えることができる容易さに影響を与えるであろうが、それは読みやすさとメンテナンスに影響を与えます。一般的に

  • ワークアウトパフォーマンスや行動の要件は(そしてあなたが両方をテストしますか)
  • が動作を実現し、最も単純な、きれいなコードを書くお勧めします
  • 参照してください。パフォーマンス要件を満たしている場合
  • 問題が解決しない場合は、問題がどこであるかを分析し、改善するために「最も汚れのない」変更を行います。 (これは、マイクロ最適化ではなく設計変更を行うことを意味する場合があります)。
  • パフォーマンス要件を満たすコードが得られ、できるだけクリーンな状態になるまで、すすいでください。
+0

はこの答えを印刷し、私のブースでそれをぶら下げ、より読みやすいですが。 –

5
  1. 彼らはまったく同じであり、すべての違いは、バイトコードにコンパイルした後に失われます。
  2. 理論的に(別のJavaでは)1つの余分なメモリ書き込みが可能な最悪のシナリオを想像しても、その差は非常に馬鹿げて小さく、世界で最も正確な原子時計が必要です。
  3. 実際の違いは、コードの全体的な保守性にあり、2-3%未満の実際の速度差よりもはるかに高い懸念があるはずです。たとえば、多くのデザインパターンでは、ある程度のオーバーヘッドが発生しますが、コードベースに与える柔軟性の点で、それを支払う意欲があります。コードの最適化で

勝利小型の罠に陥ることは非常に簡単で、ビッグを失う:個々の方法は完璧に最適化することができるが、システム全体のパフォーマンスは、まだの不備に起因する災害かもしれグローバルアーキテクチャ。トップダウンを常に最適化しなければなりません。その場合、最適化されたバージョンに置き換えられた場合、全体のパフォーマンスに貢献できるコードは1%以下です。

+0

正しくリコールすれば、1)が間違っています:2番目の例でループが終了した後で、定義されたスコープから離れても、brが定義されなくなります。これにより、誤って変数を再利用することができなくなるため、保守が容易になります。 – Izkata

+0

@izkata 1)は、メンテナンスの違いではなく、実行時の効率性に関するものです。コンパイラは、 'br 'の使用が' for'ループで終わっていることを簡単に検出し、内部で宣言されているかのように扱います。 –

0

効率性はどちらも同じですが、ほとんどの場合、同様のバイトコードにコンパイルされます。

第2のアプローチが読みやすくなっています。通常、コードが大きくなると多くの助けになります。特にデバッグ中に、その変数が後でそのブロックの外で変更されることを心配する必要はありません。

1

唯一の違いは、brは2番目のケースがループのスコープにローカルであるのに対して、最初のケースではループの外側にアクセスできることです。しかし、最初のケースであっても、br ref変数は、outaideループで利用可能であり、forループ内で与えた値ではありません。

それ以外は同じです。後者の場合は、

0

3.

for(File f : files) 
{ 
    try(BufferedReader br = new BufferedReader(......)) 
    { 
     ...... 
    } 
} 
関連する問題