首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java If优化

Java If优化
EN

Stack Overflow用户
提问于 2015-05-28 11:07:49
回答 4查看 954关注 0票数 4

我有以下声明:

代码语言:javascript
运行
复制
isEnabled = false;
if(foo(arg) && isEnabled) {
 ....
}

public boolean foo(arg) {
  some really long running code
}

交换if中的语句是否有意义?

代码语言:javascript
运行
复制
if(isEnabled && foo(arg)) { ... }

还是编译器为我做了优化?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-28 11:12:13

注意,如果foo()也有side effects,那么这两个表达式不具有相同的行为。

如果它正在操作程序的状态,那么如果您总是调用它,或者只作为isEnabled值的依赖项调用它,则会产生很大的不同。

例如,考虑:

代码语言:javascript
运行
复制
boolean foo(Object arg) { 
  someLocalVariable = arg;
  //do some calculation and return an answer
}

如果总是调用foo(),或者只在打开isEnabled的情况下调用它,会导致以下两个表达式完全不同:

代码语言:javascript
运行
复制
if (isEnabled && foo(arg)) { ...}  //local variable changes only if isEnabled==true
if (foo(arg) && isEnabled) { ...} //local variable always changes
票数 12
EN

Stack Overflow用户

发布于 2015-05-28 11:09:44

在这种情况下,编译器不会进行任何优化。

代码语言:javascript
运行
复制
if(isEnabled && foo(arg)) { ... }

总是更好的方法。

因为我猜您知道,当isEnabled为false时,它不会计算foo(arg)。编译器将维护您的指令序列。

票数 4
EN

Stack Overflow用户

发布于 2015-05-28 11:11:38

由于编译器必须保持其本身的逻辑(这包括语句的顺序),所以不会对其进行优化。

假设foo()有一个副作用,这是代码的其他部分所依赖的,更改顺序可能会破坏这一点。当然,在大多数情况下,这不是很好的样式,但是编译器不能依赖或执行样式,所以它必须信任这里的开发人员。

示例:

代码语言:javascript
运行
复制
int x = 0;

boolean foo(int arg) {
  x = arg;
  return x > 0;
}

void someMethod(int arg) {
  boolean isEnabled = false;
  if(foo(arg) && isEnabled) {
    //whatever  
  }

  //here you use x, I'll simply print it
  System.out.println("x=" + x);
}

void someOtherMethod(int arg) {
  boolean isEnabled = false;
  if(isEnabled && foo(arg)) {
    //whatever  
  }

  //here you use x, I'll simply print it
  System.out.println("x=" + x);
}

现在调用这些方法:

代码语言:javascript
运行
复制
someOtherMethod(7); //foo(7) will not be called so x will still be 0
someMethod(5);    

你会得到输出

代码语言:javascript
运行
复制
x=0  
x=5 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30504850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档