3

下面是两个片段。请注意程序之间的唯一区别是一个break to return和另一个return立即。我知道在方法中设置一个退出点是一种很好的设计实践。但我不担心这里的设计。如果我为使用支付额外费用,我需要支付break多少额外的计算/内存/时钟周期?

方案一:

public boolean doThis(String[] A){
  boolean indicator = false;
  for(int i=0; i<A.length; i++){
      if(A[i].equals("Taboo"))
        break;
      for(int x=0; x<=i; x++)
          //some work is done here. to make indicator true or false
  }
  return indicator;
}

方案二:

public boolean doThis(String[] A){
  boolean indicator = false;
  for(int i=0; i<A.length; i++){
      if(A[i].equals("Taboo"))
        return false;
      for(int x=0; x<=i; x++)
          //some work is done here. to make indicator true or false
  }
  return indicator;
}
4

1 回答 1

4

如果您的编译器有任何好处,那么您为“return false”情况支付的费用会少一点。

您可能会认为“休息”很昂贵。使用一个糟糕的编译器,它是一个返回返回的单跳转指令。一个好的编译器会意识到跳转是多余的,如果您不介意扩展代码,可以将返回语句提升到中断点。

使“返回错误”的情况稍微便宜一些的原因是,“返回指示符”可能需要从内存中提取以将结果放置在编译器几乎普遍使用的调用约定结果返回寄存器中。"return false" 将常量加载到寄存器中(特别是结果返回寄存器);在现代机器上,这总是比从内存中获取更快,因为文字嵌入在处理器已经获取的指令流中。

复杂的编译器可能会将所有变量保存在寄存器中。在这种情况下,“返回指示符”实际上可能更快,因为智能编译器可能已经计划将“指示符”放在结果返回寄存器中;无需任何工作即可加载该值。对于您使用 string equal 调用编写的程序,我怀疑编译器会尝试将所有变量保留在寄存器中;它只需要在调用equal时昂贵地将它们全部溢出。

除了所有这些细节之外,这不是您应该担心优化的事情。

于 2012-05-18T02:04:51.507 回答