以下是两个片段。请注意,程序之间的唯一区别是一个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;
}
答案 0 :(得分:4)
如果您的编译器有任何好处,那么您为“返回错误”情况支付的费用会少一点。
你可能会认为“休息”很昂贵。使用一个糟糕的编译器,它是一个单一的跳转指令落在返回上。一个好的编译器会意识到跳转是超级的,并且如果你不介意扩展代码,可以将return语句提升到休息点。
使“返回错误”情况稍微便宜的原因是“返回指示符”可能需要从内存中获取以将结果放置在编译器几乎普遍使用的调用约定结果返回寄存器中。 “return false”将常量加载到寄存器中(特别是结果返回寄存器);这总是比现代机器上的内存提取更快,因为文字嵌入在处理器已经提取的指令流中。
复杂的编译器可能会将所有变量保留在寄存器中。在这种情况下,“返回指示符”实际上可能更快,因为智能编译器可能已经计划在结果返回寄存器中放置“指示符”;没有工作需要加载该值。对于使用字符串相等调用编写的程序,我怀疑编译器会尝试将所有变量保存在寄存器中;它只需要昂贵地将它们全部用于平等的呼吁。
除了所有这些精细细节之外,这不是你应该担心优化的事情。