1

コンパイラーは以下の2つのケースを同じように扱いますか、それともx / 2が常に再評価されないため、ケース2はパフォーマンスの向上をもたらしますか?私はいつも後者を想定してきましたが、誰かがこれを確認できれば素晴らしいと思います。

ケース1:

double result;
for (int i = 0; i < 10000000; i++) {
    result += variables[i] * (x/2);
}
return result;

ケース2:

double result;
double xOverTwo = x/2;
for (int i = 0; i < 10000000; i++) {
    result += variables[i] * (xOverTwo);
}
return result;
4

1 に答える 1

7

それは何であるかに依存しxます。

定数の場合、計算はコンパイル時に行われるため、2つのコードは同じように実行されます。揮発性変数の場合、コンパイラーは毎回計算を実行するように強制されるため、ループの外で計算することで間違いなくメリットがあります。

それ以外の場合は、コンパイラ自体がコードを最適化してループ外で計算を実行できるかどうかによって異なります。安全のために、ループの外側の値を計算できます。

もちろん、あなたの例ではx、ループ内で使用する必要はまったくありません。これは、使用するメソッドを最適化する代わりに変更する例です。

double result;
for (int i = 0; i < 10000000; i++) {
    result += variables[i];
}
return result * (x / 2);
于 2012-11-10T23:51:36.250 に答える