【问题标题】:What is the level of optimization of the java compiler?java编译器的优化程度如何?
【发布时间】:2015-10-13 16:42:55
【问题描述】:

让我们考虑下面这个在循环中执行超过一百万次的语句。

boolean validity = condition1 || condition2;

可以安全地假设 condition1condition2 都有非常复杂的计算。因此,由于这里有一个 OR 运算符,我认为最好先分别检查 condition1,然后在必要时检查 condition2 之后喜欢,

boolean validity = condition1;
if( !validity )
    validity = condition2;

我应该手动执行这样的优化还是 java 编译器自动处理这些事情?

【问题讨论】:

标签: java performance optimization


【解决方案1】:

正如 Java 语言规范,§15.24 所说:

条件或运算符|| 运算符类似于| (§15.22.2),但仅当其左侧操作数的值为假时才计算其右侧操作数。

因此,语言规范要求仅当左侧部分为假时才评估右侧部分。这不是优化,它是语言的一部分。优化不是语言规范的一部分,它们可能会使您的代码更快,但它们绝不应该使您的代码表现得不同。但是,如果这两个部分都被评估为正确的部分可能会产生副作用,那么这里的行为会有所不同。

【讨论】:

  • 感谢塔吉尔的回答。那么在任何情况下,急切操作优于短路操作吗?
  • @KiranR,其实我不知道这种情况。当检测到非短路布尔表达式时,FindBugs 会尝试report,我不记得有人抱怨这种报告是误报(我是 FindBugs 的贡献者)。可能它是在 Java 1.0 中添加的,只是为了更接近 C... 当然 | 对于 int/long 类型非常有用,但对于 boolean 则不是。
【解决方案2】:

java 编译器首先能够执行condition1 的函数。当它为真时,条件2 的函数将不再执行。所以不需要优化。这是因为存在 OR 操作。

【讨论】:

  • 显然您没有阅读答案。与其他我写的完全一样。但没有参考规范。
猜你喜欢
  • 2016-06-30
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
相关资源
最近更新 更多