我通常使用 Java 编写代码,但最近我研究了手动优化 C 代码的方法。经常做的一件事(除了循环提升之外)是使用“数学”消除“条件”。这通常依赖于“boolean ”值(例如“a == b”的结果)也是整数类型,可用于乘以其他值。但在Java中, boolean 值不是整数。我可以将 boolean “标志”转换为整数,如下所示:
int i = 标志? 1:0;
但是从“语法”上来说,这也是一个“条件”。我的问题是,这通常会被 JIT 变成“无跳转”的东西吗?
如果没有,但其他一些表达式会产生所需的效果,我也想知道。
编辑:根据评论,我会更具体:是 Oracle JVM 中针对 x86/x64 (Intel/AMD) CPU 优化的表达式。
最佳答案
Hotspot JVM 通常使用 CMOV 消除分支除非分支是相当可预测的(那么分支更便宜,因为它需要少一条指令,例如 this answer of mine )。
在机器代码(不是字节码!)中将 boolean
直接解释为 int
也是可能的,但我无法判断它是否完成。您需要查看 JIT 输出(这需要安装一些工具)。
查看字节码是毫无意义的。除非您对启动行为感兴趣,即在 C1(快但笨)和 C2(智能但慢)JIT 编译器启动之前。
关于java - "conditional"是否被 "int i = flag ? 1 : 0;"中的 JIT 删除了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47074910/