0

重複の可能性:
ループの内側または外側で変数を宣言する

Javaコードの次の2つのサンプルを検討してください。

// 1st sample
for (Item item : items) {
    Foo foo = item.getFoo();
    int bar = item.getBar();
    // do smth with foo and bar
}

// 2nd sample
Foo foo;
int bar;
for (Item item : items) {
    foo = item.getFoo();
    bar = item.getBar();
    // do smth with foo and bar
}

サンプル間でパフォーマンス/メモリ消費量に違いはありますか?もしそうなら、それはハンドルのタイプ(オブジェクト対プリミティブ)に依存しますか?

4

2 に答える 2

8

生成されるバイトコードに関しては違いがありますが、パフォーマンスに関しては違いはありません。

はるかに重要なのは、コードを可能な限り単純で、自己完結型で、保守しやすいものにすることです。このため、最初の例をお勧めします。

ところで:JITが可能な限り最適化するのが簡単なため、単純なコードの方が最適化されることがよくあります。紛らわしいコードはJITも混乱させ、最適化の使用を妨げます。

生のバイトコードを読み取り可能な形式でダンプする(そして元のバイトコードに戻すことができる)ASMifierClassVisitorを使用する場合javap、それほど重要ではない詳細の一部に光沢があることがわかります。

(左下の)951バイトの長さで比較すると。

List<Item> items = new ArrayList<Item>();

Foo foo;
int bar;
for (Item item : items) {
    foo = item.getFoo();
    bar= item.getBar();
    // do something with foo and bar
}

(右下)と935バイトの長さ。

List<Item> items = new ArrayList<Item>();

for (Item item : items) {
    Foo foo = item.getFoo();
    int bar = item.getBar();
    // do something with foo and bar
}

少なくともデバッグ行番号は異なる必要があることがわかりますが、コードの一部や、異なる順序で定義され、異なる割り当て番号が指定されたローカル変数も異なります。

ここに画像の説明を入力してください

right click=>View Image画像をよりよく見ることができます。

于 2012-09-27T07:55:55.237 に答える
1

2 番目の例でスコープのリークが心配な場合は、ブロックに入れてスコープを制限することもできます。

{
    Foo foo;
    int bar;
    for (Item item : items) {
        foo = item.getFoo();
        bar = item.getBar();
        // do smth with foo and bar
    }
}
于 2012-09-27T07:58:36.753 に答える