9

I wanna read documents and process them. Each iteration processes one document.

Which kind of code is better?

1.

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

2.

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

My point is which one is more efficient in terms of space and speed?

4

6 に答える 6

11

後者は私の見解ではより明確です。一般に、可能な限り最小のスコープでローカル変数を宣言することを好み、理想的には宣言の時点でそれらを初期化します。

パフォーマンスに直接影響することはありませんが、可読性と保守性に影響し、パフォーマンス影響する変更を簡単に行うことができなくなります。

一般に:

  • パフォーマンスと動作の要件を解決する (および両方をテストする方法)
  • 必要な動作を実現する最も単純でクリーンなコードを記述します
  • パフォーマンス要件を満たしているかどうかを確認する
  • そうでない場合は、問題がどこにあるかを分析し、「汚れが最も少ない」変更を加えて改善します。(これは、マイクロ最適化ではなく設計変更を行うことを意味する場合があります。)
  • パフォーマンス要件を満たし、可能な限りクリーンなコードが得られるまで、泡立てて、すすぎ、繰り返します。
于 2012-11-19T19:40:40.463 に答える
5
  1. それらはまったく同じであり、すべての違いはバイトコードにコンパイルした後に失われます。
  2. 理論的には (別の Java では) メモリ書き込みが 1 回増える最悪のシナリオを想像したとしても、その差はとてつもなく小さいので、それを測定するには世界で最も正確な原子時計が必要になります。
  3. 実際の違いは、コードの全体的な保守性にあるはずであり、実際の速度の違いが 2 ~ 3% 未満であることよりも、はるかに大きな懸念事項となるはずです。たとえば、多くの設計パターンでは何らかのオーバーヘッドが発生しますが、コード ベースに柔軟性を与えることで、人々はそれを喜んで支払います。

コードの最適化では、「小さく勝って大きく負ける」という罠に陥りがちです。個々の方法は完璧に最適化されていても、全体的なシステム パフォーマンスは、グローバル アーキテクチャの不備によって依然として惨事になる可能性があります。常にトップダウンで最適化する必要があります。そうすると、最適化されたバージョンに置き換えた場合、実際に全体的なパフォーマンスに貢献できるコード行は 1% 以下であることがわかります。

于 2012-11-19T19:41:05.910 に答える
3

他の場所で変数を使用しない場合br、それらは両方ともまったく同じです。

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

于 2012-11-19T19:39:38.537 に答える
1

唯一の違いは、br2番目のケースはループのスコープがローカルであるのに対し、最初のケースはループ外でアクセスできることです。ただし、最初の場合でも、brref変数はループ外で使用可能であり、forループ内で指定した値ではないことに注意してください。

それ以外はまったく同じです。2番目のケースはより読みやすいですが

于 2012-11-19T19:44:00.573 に答える
0

3.

for(File f : files)
{
    try( BufferedReader br = new BufferedReader(......) )
    {
        ......
    }
}
于 2012-11-19T20:19:47.483 に答える
0

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

読みやすさに関しては、2 番目のアプローチの方が優れています。通常、コードが大きくなると非常に役立ちます。特にデバッグ中は、後でその変数がそのブロックの外で変更されることを心配する必要はありません。

于 2012-11-19T19:42:05.937 に答える