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 次,这意味着将不必要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++,那么请随意用类的成员字段替换静态。)

4

1 回答 1

1

恕我直言,不值得进行微优化。优化的一个缺点是它严重依赖于环境(正如您提到的 JIT——JDK 的版本起着重要作用;现在更快的东西将来可能会更慢)。

从长远来看,代码可维护性(在我看来)要重要得多。实现最清晰的版本。例如,我喜欢getTrueOnlyOnFirstCall()其中包含该if语句。

但是,在所有这些示例中,您需要围绕 getter 和修改布尔值的部分进行同步。

于 2012-10-26T18:47:13.860 回答