在下面的代码中,假设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 次,这意味着将不必要value
地设置为99999 次。false
另一个变体(更快?更好?)看起来像这样:
public static int[] getTrueOnlyOnFirstCall() {
boolean b = value;
if (b) {
value = false;
return true;
}
return false;
}
此外,编译时和 JIT 时优化也可能在这里发挥作用,所以这个问题可以扩展为“and what about in C++”。(如果我的示例不适用于这种形式的 C++,那么请随意用类的成员字段替换静态。)