1

これはpremature optimization問題か何かである可能性があると思います。

次の 2 つのコード スニペットについては、

public void doSomething1(final int a) {
    final int b = a -1;
    doSomethingElse(b);
    doSomethingElse(b);
}

public void doSomething2(final int a) {
    doSomethingElse(a - 1);
    doSomethingElse(a - 1);
}

doSomething1よりも優れていdoSomething2ますか?doSomething2は 2 つの異なる を使用しますintか?

アップデート

多分私は反対票に値するでしょう。しかし、このように可変長ビット (バイトではない) を読み書きする実際のコードがあります。

final int unsignedLength = length - 1;

return (((readBoolean() ? ~0 : 0) << (length - 1))
        | readUnsignedInt(length - 1));

(length - 1)とのパーツ交換に興味がありましたunsignedLength

ありがとう。

4

4 に答える 4

3

アプリケーションに与える違いは非常に小さいため、このレベルで最適化を試みるのは一般的に完全にやり過ぎです。2回doSomething1計算する必要がないため、より効率的なものになるはずです。a - 1ただし、この種のことはコンパイラによって最適化される場合があります。

コードが多いにもかかわらずdoSomething1、計算a - 1が行われる場所は 1 か所だけです。これにより、ミスをする可能性が低くなります。

于 2013-05-09T04:42:28.530 に答える
1
public void doSomething1(final int a) {
    final int b = a -1;
    doSomethingElse(b);
    doSomethingElse(b);
}

public void doSomething2(final int a) {
    doSomethingElse(a - 1);
    doSomethingElse(a - 1);
}

それは大きな問題ではないと私は信じていますが、doSomething1より効率的ですdoSomething2。あなたが述べたように、これは時期尚早の最適化の問題のようです。a-1なぜ複数回計算するのですか?取るに足らないように思えますが、これらの小さなことは合計されます。効率がメモリ割り当てよりも重要である限り、答えはあると思います。明らかにこれは些細な例ですが、効率的に考える doSomething1よりは間違いなく好ましいです。doSomething2

于 2013-05-09T04:40:13.797 に答える
1

doSomething1()bdoSomething2() が追加の変数を作成しない場合に、追加の変数を使用します。1 つのポイントが表示される場合、doSomething1() は操作をa-11 回だけ実行しますが、doSomething2() は 2 回実行します。これが私が思うことですが、どのオーエンが優れているかはわかりません。

于 2013-05-09T04:42:23.217 に答える
1

doSomething1 は doSomething2 より優れていますか?

この単純な例でもわずかに優れていますが、複数の場所で重複したコード (a - 1) がないため、パフォーマンスの面ではなく保守性の面で優れています。

doSomething2 は 2 つの異なる int を使用しますか?

いいえ、どちらの場合も同じです

また、これは時期尚早の最適化であり、注目すべきではありません。

パフォーマンスに関しても、 a が final として宣言され、コンパイル後に b または a-1 の式が定数に評価されるため、最も厳しいビットでも違いがあるとは思いません。

于 2013-05-09T04:43:20.830 に答える