java - Java 是否会优化函数调用以消除运行时不必要的 boolean 比较?

标签 java optimization jit

如果其中一个函数未返回 true,java 是否会在运行时实际调用所有三个函数?

通常出于调试目的,我喜欢在调试器中查看这些条件检查的结果,并将它们放在一行中会使这变得更加困难。如果有六次检查,那么代码就会变得更加难以阅读。

boolean result1 = CheckSomething();
boolean result2 = CheckSomethingElse();
boolean result3 = CheckSomeOtherThing();

boolean finalResult = result1 && result2 && result3;

如果 Java 不在运行时优化这个条件,那么通过编写这样的代码应该可以获得更好的性能,但代价是无法轻松地在调试器中看到中间值。

boolean finalResult = CheckSomething() && CheckSomethingElse() && CheckSomeOtherThing();

最佳答案

一般来说您的代码片段并不等效。第一个版本的行为必须就像调用所有函数,因为您在代码中无条件调用它们。

代码的第二个版本:

boolean finalResult = CheckSomething() && CheckSomethingElse() && CheckSomeOtherThing();

不等价,因为&&操作是快捷方式,因此如果有任何返回false,则不会调用其余函数。

在解释器中运行时,您可以预期代码的第一个版本实际调用所有方法。

现在,有趣的部分:代码编译后,编译器现在能够“查看”各种函数,确定它们是纯函数,没有副作用,并且可以编译两个版本完全相同。事实上,如果函数非常简单,最好编译两个版本始终调用所有三个函数,因为组合三个 boolean 结果并检查一次可能是如果任何结果是不可预测的,速度会快得多。

编译器可能并不总是能够确定函数是否有副作用,或者实际上可能存在只有您知道无关紧要的副作用(例如,您知道不会发生但编译器可以发生的 ArrayOutOfBoundsException不证明)。因此,通常最好编写第二种形式,它允许编译器使用短路求值,无论它能够证明函数的什么内容。

关于java - Java 是否会优化函数调用以消除运行时不必要的 boolean 比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664859/

相关文章:

java - 名为 'Flutter' 的文件已存在于此位置

Java 应用程序打包成 jar 文件后无法运行

java - Spring Boot 和 ObjectMapper 配置

performance - 游戏性能优化访谈

mysql - 如果结果不够,如何动态添加 SELECT 语句?

c++ - 对于没有 FPU 的设备,在 C++ 中使用定点算法的好处

c++ - LLVM JIT 教程代码因简单的参数化函数而崩溃。为什么?

java - Java 8 Streams 中的并行性和平面图

java - 使用 int 然后递增它比同时做两者慢吗?

cuda - 是否可以对 CUDA 内核进行即时 (jit) 编译?