java - 当 exec (i/j) 和 (i % j) 时,jvm 会执行一还是两次计算?

标签 java optimization jvm

我使用javap命令来制作字节码,有两条指令:idiv和irem。我知道div的结果存储在不同的寄存器中,jvm只会执行一次div操作吗?

int i = 10;
int a = i / 4;
int b = i % 4;

字节码:

Code:
      stack=2, locals=4, args_size=1
         0: bipush        10
         2: istore_1
         3: iload_1
         4: iconst_4
         5: idiv
         6: istore_2
         7: iload_1
         8: iconst_4
         9: irem
        10: istore_3
        11: return

最佳答案

如果您解释字节码,JVM 会将 idivirem 视为单独的(字节码)指令并单独执行它们。

如果您正在谈论已编译为 native 代码的代码,则它将取决于:

  • 您的执行平台上是否存在结合除法和余数的 native 指令1,以及
  • JIT 编译器是否利用该指令的功能。

您可以使用-XX+PrintAssembly选项来检查JIT编译器生成的内容。 (您还需要提供 -XX:UnlockDiagnosticVMOptions:请参阅 java 手册条目。)

请注意,答案可能取决于硬件和 Java 版本。

<小时/>

1 - 适用于 x86x86-64 的 32 位和 64 位 IDIV 指令。

关于java - 当 exec (i/j) 和 (i % j) 时,jvm 会执行一还是两次计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57840056/

相关文章:

java - 将类移动到包后,Netbeans Java Web 应用程序不会部署

java - 如何存储值并从共享首选项中检索它们

mysql - 如何使用 JOINED 表和 ORDER BY 和 OFFSET 改进 MySQL 查询

optimization - 如何描述贝尔曼方程的最优策略 (pi*)?

java - Java 'pointers' 是整数吗?

java - 在 JAR 文件中包含 AWS 凭证

c++ - 我可以让 C++ 编译器在编译时实例化对象吗?

java - 可见性和 javac/JVM 内联

java - 一些SerialCG日志的含义

java - Java组合框填充Vector时如何排序?