我使用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 会将 idiv
和 irem
视为单独的(字节码)指令并单独执行它们。
如果您正在谈论已编译为 native 代码的代码,则它将取决于:
- 您的执行平台上是否存在结合除法和余数的 native 指令1,以及
- JIT 编译器是否利用该指令的功能。
您可以使用-XX+PrintAssembly
选项来检查JIT编译器生成的内容。 (您还需要提供 -XX:UnlockDiagnosticVMOptions
:请参阅 java
手册条目。)
请注意,答案可能取决于硬件和 Java 版本。
<小时/>1 - 适用于 x86
和 x86-64
的 32 位和 64 位 IDIV
指令。
关于java - 当 exec (i/j) 和 (i % j) 时,jvm 会执行一还是两次计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57840056/