1

メソッドの一部に最大 9 つifのステートメントを含むコードがあり、それらのほとんどすべてが本質的にif要件の 1 つだけを満たしている場合、コードを使用するとelse ifコードが高速化されますか?

たとえば、私がこれを持っていたら

if (x == 1){
    do something;
}
if (x == 2){
    do something;
}
if (x == 3){
    do something;
}
if (x == 4){
    do something;
}

これに変更すると、コードが高速化されますか?

if (x == 1){
    do something;
}
else if (x == 2){
    do something;
}
else if (x == 3){
    do something;
}
else if (x == 4){
    do something;
}

私の実際のコードでは、ifステートメントは整数よりも複雑なものを評価しています。

4

8 に答える 8

2

For If の場合は比較が行われてもチェックが続行されますが、else 部分は相互に排他的であるため、それ以上比較されません。以下のコードを実行すると、はっきりと理解できます。時間はマイクロ秒単位です。

public class Test {

public static void main(String[] args) {

    ifCase(5);
    ifElseCase(5);
}

private static void ifCase(int x) {

    long start = System.nanoTime();
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }
    if (x == 1) {
        System.out.println(x);
    }
    if (x == 2) {
        System.out.println(x);
    }
    if (x == 3) {
        System.out.println(x);
    }
    if (x == 4) {
        System.out.println(x);
    }
    if (x == 5) {
        System.out.println(x);
    }
    if (x == 6) {
        System.out.println(x);
    }
    if (x == 7) {
        System.out.println(x);
    }
    if (x == 8) {
        System.out.println(x);
    }

    long end = System.nanoTime();

    System.out.println("time " + (end - start) / 1000);

}

private static void ifElseCase(int x) {
    long start = System.nanoTime();
    if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    } else if (x == 1) {
        System.out.println(x);
    } else if (x == 2) {
        System.out.println(x);
    } else if (x == 3) {
        System.out.println(x);
    } else if (x == 4) {
        System.out.println(x);
    } else if (x == 5) {
        System.out.println(x);
    } else if (x == 6) {
        System.out.println(x);
    } else if (x == 7) {
        System.out.println(x);
    } else if (x == 8) {
        System.out.println(x);
    }
    long end = System.nanoTime();

    System.out.println("time " + (end - start) / 1000);
}

}

于 2013-08-14T09:39:21.443 に答える
2

最後のelseが実行されている場合はいいえ、中間条件が真であることが判明した場合ははい。

ただし、条件が相互に排他的である場合は、一般に if-else ステートメントを使用する方が理にかなっています。他のオプションはswitch ステートメントを使用しています。

結局のところ、(Java)インタープリターはそのように機能します。中間バイトコードを 1 行ずつスキャンします... マシン コードに変換して実行します (ここでは JIT コンパイラを考慮していないと仮定します)。そのため、複数の if ステートメントを使用するよりも、if-else を使用する方が効果的です。

于 2013-08-14T09:26:39.520 に答える
1

switch数値を比較する場合はa を使用するとさらに効率的ですが、elseすでに使用すると速度が向上します。

考えてみてください。あなたの最初の例では、すでにヒットしていたとしても、すべての比較が行われます。2 番目の例では、マシンはいずれかが true になるまで比較のみを行い、残りの比較はそれ以上実行されません。

より高価な比較が行われると、その効果は劇的になる可能性があります。私はかつて(〜2003年)、欠落しているsを追加することにより、産業用ロボットのパーサーを「最適化」しましたelse。構成ファイルの解析が 10 秒以上から 1 秒未満に高速化されます (その「解決策」でさえ非常に非効率的ですが、それは別の話です)。

于 2013-08-14T09:28:16.460 に答える
0

elseないときだけ実行するifので、確実に高速化されます。しかし、起こらないelse場合に備えてこれを行うことを意味します。if

于 2013-08-14T09:23:11.653 に答える