-5

コードを最適化しようとすると、しばしばジレンマに陥ります。

次のような表現があります。

int x = 5 + y * y;
int z = sqrt(12) + y * y;

2 つのインスタンスの y*y を格納する新しい整数変数を作成する価値はありますか?

int s = y* y;
int x = 5 + s;
int z = sqrt(12) + s;

そうでない場合、それだけの価値があるにはいくつのインスタンスが必要ですか?

4

3 に答える 3

1

古いコンパイラの最適化の 1 つは、「共通部分式の削除」です。この場合y * yは、そのような共通部分式です。

式の計算は 1 回だけでよいことをコードの読者に示すことは依然として理にかなっているかもしれませんが、過去 10 年間に作成されたコンパイラは、乗算を繰り返さずにこれを完全に計算します。

「独自のゲームでコンパイラを打ち負かす」試みは、多くの場合無駄であり、コンパイラよりも優れた結果が得られるように測定する必要があります。余分な変数を追加すると、コンパイラが「混乱」するため、より悪いコードが生成される可能性があり、まったく役に立たない場合があります。

そして、パフォーマンス (またはコード サイズ) がさまざまな最適化の結果になる場合は常に、測定、再測定、3 回目の測定を行って、期待どおりの結果が得られるようにします。どちらが高速でどちらが低速かを見て、コードを予測するのは簡単ではありません。y * yしかし、コンパイラの最適化レベルが低い場合でも、 が 2 回計算されると、間違いなく驚かれることでしょう。

于 2013-07-12T16:22:04.513 に答える