以下のコードでは、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 をクラスのメンバー フィールドに自由に置き換えてください。)