1

プログラミング中に、次のシナリオ (コードで説明) に出くわすことがよくあります。ブロック内で使用する変数を定義します。

    int maximumLengthOfToken = 0;

    while(fileScanner.hasNextLine())
    {
       String line; // definition
       line = fileScanner.nextLine();

       Scanner lineScanner; // definition
       lineScanner = new Scanner(line);

       String token = lineScanner.next(); // definition and assignment
       if(stringToMatch.endsWith(token))
        {
                 if(token.length() >= maximumLengthOfToken )
                  {
                     maximumLengthOfToken = token.length();  
                     builder.append(line);
                     builder.append("\n\n\n");
                  }
        }
    }
    fileScanner.close();

ただし、「きちんと」するために、また私が C のバックグラウンドを持っているため、使用される場所に関係なく、すべての変数を最初に定義することが好きな場合があります。だから私は次のことをします -

    int maximumLengthOfToken = 0;
    String line; // definition
    Scanner lineScanner; // definition
    String token; // definition

    while(fileScanner.hasNextLine())
    {
       line = fileScanner.nextLine();
       lineScanner = new Scanner(line);

       token = lineScanner.next(); // definition

               if(stringToMatch.endsWith(token))
                {
                 if(token.length() >= maximumLengthOfToken )
                  {
                     maximumLengthOfToken = token.length();  
                     builder.append(line);
                     builder.append("\n\n\n");
                  }
        }
    }
    fileScanner.close();

「あっ! すっきりしているな」と思います。

しかし、これはコードのパフォーマンスに影響を与えますか? 最初のスタイルはコードの実行を高速化しますか、それとも 2 番目のスタイルを使用しますか? また、そのような場合の規則は何ですか?それが最初のスタイルだと思います。

4

6 に答える 6

4

いいえ。パフォーマンスの違いはありません。

これに疑問がある場合は、次のように自問してみてください。答えはノーであるべきです。

違いが生じる可能性がある唯一のケースは、変数が使用される前にプロセッサ キャッシュ(局所性を参照)から削除された場合です。この場合、変数を使用されている場所に近づけると、速度が向上する可能性があります。しかし、それを実現するには、変数とその使用の間に多くのコードが必要になります。

とにかく、コンパイラがメソッドを同じバイトコードにコンパイルする可能性もあります。要するに、気にしなくていいと思います。

于 2012-04-06T22:05:05.790 に答える
2

他の人が言っているように、パフォーマンスに大きな違いはありません。

メソッドの先頭に変数宣言を配置するか、使用される場所の近くに変数宣言を配置するかを選択します。その選択に自分を無理に押し込まないでください。メソッドを非常に短くすることで、両方を持つことができます。この選択に直面した場合は、「メソッドが長すぎます」というコードとして扱います。

メソッドが短いほど、記述、テスト、デバッグ、保守が容易になります。(たとえば)10行を超えるメソッドがない場合、この問題に直面することはありません。コードがより適切に編成されます。

于 2012-04-06T22:46:00.990 に答える
1

これはおそらくコードのパフォーマンスには何の影響も与えません -- 生成されたバイトコードは同じだったと思います -- しかし、一般的には最初のバージョンの方が保守しやすく読みやすいと考えられています。

于 2012-04-06T22:05:10.247 に答える
0

一般的なケースでは、わずかな (場合によっては劇的な) 違いがある可能性がありますが、Java の場合、標準のコンパイラ チェーンではほとんど違いはありません。

コンパイラが異なる傾向があるのは、「varA」が 1 つの範囲で定義され、「varB」が互いに素な範囲で定義されている場合です。コンパイラは、範囲がばらばらであることを確認し、両方に同じスタック スロットを割り当てることができます。これにより、インタープリターのパフォーマンスが非常にわずかに向上します。しかし、逆に言えば、この手法は、何が起こったのかを理解するほど賢くなければ、JITC の最適化を悪化させる可能性があります。

于 2012-04-06T22:07:36.600 に答える
0

変数のスコープに関する最大の「パフォーマンス」の違いは、ガベージ コレクションにあります。変数をローカルで宣言すると、使用されていない変数が GC によってより早く収集される可能性があります。

于 2012-04-07T00:26:00.677 に答える
0

最新の Java 実装では実行時最適化が使用されているため、大きな違いは見られないはずです。したがって、主に明快さとメンテナンスの容易さに重点を置く必要があります。

とはいえ、変数を使用する場所のできるだけ近くで宣言するのには、いくつかの正当な理由があります。

  • 特に非常に短期間の (一時的な) 変数を使用すると、読みやすくなります。リーダーは、メソッドの先頭までスクロールしなくても、変数の型をすぐに確認できます。

  • 変数のスコープを可能な限り制限することで、ループ カウンターを再利用する場合などの不注意によるエラーの可能性を減らします。

  • エスケープ分析などの一部の最適化は、変数のスコープが可能な限り制限されている場合にパフォーマンスが向上する場合があります。

ちなみに、私は C と Java の両方でプログラミングを行っていますが、コンテキストを切り替えるのが難しい場合があります。ただし、Java で C スタイルの規則を使用する (またはその逆) ことは、あまり良い考えではありません。C の規則は、Java にはない制限によって決定されます。それらを使用すると、他の人がコードを読みにくくなるだけです。

于 2012-04-06T22:38:02.797 に答える