java - "conditional"是否被 "int i = flag ? 1 : 0;"中的 JIT 删除了?

标签 java optimization

我通常使用 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/

相关文章:

java - 如何使用 HashMap 作为一个参数使用 HTTPClient 发送 POST 请求

c - 在优化 C 中的分段素筛时卡住了

c++ - 与裸 __m128 相比,SSE vector 包装器类型的性能

字符 a[512] 与字符 b[512 + 1]

java - 搜索数组列表,从数组列表中删除项目,将其添加到其他地方

java - JPA 持久类从不同的 JAR 扩展另一个类

java - 如何计算包含一个数字但不包含另一个数字的数字?

c++ - -fomit-frame-pointer,使用它安全吗?

java - 在 iphone 或 Java 上实现像 Scorched Earth Game 这样的地形破坏

java - Elasticsearch : Can't get Native (Java) Script working