0

以下のコードでは、getAndClear()が何十億回も呼び出されると仮定します。つまり、パフォーマンスが重要であると仮定します。最初の呼び出し時にのみ配列を返します。以降のすべての呼び出しで null を返す必要があります。(つまり、私の質問はある意味でマイクロ最適化に関するものであり、それが悪い習慣であることは承知していますが、「どのコードがより優れているか」または「よりエレガントであるか」という問題と見なすこともできます。)

public class Boo {
   public static int[] anything = new int[] { 2,3,4 };
   private static int[] something = new int[] { 5,6,7 }; // this may be much bigger as well

   public static final int[] getAndClear() {
      int[] st = something;
      something = null;
      // ... (do something else, useful)            

      return st;
   }
}

以下のコードは高速ですか?それはより良い練習ですか?

public static int[] getAndClear() {
   int[] array = sDynamicTextIdList;
   if (array != null) {
      sDynamicTextIdList = null;
      // ... (do something else, useful)     
      return array;
   }
   // ... (do something else, useful)     

   return null;
}

さらなるバリアントは次のようになります。

public static int[] getAndClear() {
   int[] array = sDynamicTextIdList;
   if (array != null) {
      sDynamicTextIdList = null;
   }
   // ... (do something else, useful)     
   return array;
}

おそらくハードウェア アーキテクチャ レベルと CPU 命令 (何かを 0 に設定するか、0 をチェックするか) に分解されることはわかっていますが、パフォーマンスに関しては問題ではありません。以上の品質のコード。この場合、質問は次のように要約できます。

private static boolean value = true;       

public static int[] getTrueOnlyOnFirstCall() {
   boolean b = value;
   value = false;
   return b;
}

メソッドが 100000 回呼び出された場合、これは不必要に 99999 回valueに設定されることを意味します。false他のバリアント (より速い? より良い?) は次のようになります。

public static int[] getTrueOnlyOnFirstCall() {
   boolean b = value;
   if (b) { 
      value = false;
      return true;
   }
   return false;
}

さらに、コンパイル時および JIT 時の最適化もここで役割を果たす可能性があるため、この質問は「C++ ではどうなのか」によって拡張される可能性があります。(私の例がこの形式の C++ に当てはまらない場合は、statics をクラスのメンバー フィールドに自由に置き換えてください。)

4

1 に答える 1

1

IMHO、マイクロ最適化を行う価値はありません。最適化の欠点の 1 つは、環境に大きく依存することです (JIT について述べたように、JDK のバージョンが大きな役割を果たします。現在は高速であっても、将来は遅くなる可能性があります)。

コードの保守性は (私の意見では) 長期的にははるかに重要です。最も明確なバージョンを実装します。たとえばgetTrueOnlyOnFirstCall()、ステートメントを含む が好きです。if

ただし、これらすべての例では、getter とブール値を変更する部分の周りで同期が必要です。

于 2012-10-26T18:47:13.860 に答える