在Java方法中使用dup进行计算

时间:2018-02-05 18:34:27

标签: java jvm javac

我目前有一个方法可以执行以下操作:给定:value,offset,stride,它将值添加到值,使其保持在一组大小步幅内。
实例:

  

20,5,30 => 25个
  29,5,30 => 4
  42,5,30 => 47个

我目前的代码是:

int cycle(int value, int offset, int stride) {
    final int rem = value % stride;
    return ((rem + offset) % stride - rem + value);
}

编译如下:

int cycle(int, int, int);
  Code:
     0: iload_1
     1: iload_3
     2: irem
     3: istore        4
     5: iload         4
     7: iload_2
     8: iadd
     9: iload_3
    10: irem
    11: iload         4
    13: isub
    14: iload_1
    15: iadd
    16: ireturn

是否有任何代码更改和/或编译器选项的组合可以使它产生类似的东西? (这个例子是手写的):

int cycle(int, int, int);
  Code:
     0: iload_1
     1: iload_3
     2: irem
     3: dup
     4: iload_2
     5: iadd
     6: iload_3
     7: irem
     8: isub
     9: iload_1
    10: iadd
    11: ireturn

1 个答案:

答案 0 :(得分:1)

大多数优化JVM,最常见的是通常使用HotSpot JVM,在应用任何其他优化之前,会将代码转换为SSA form。对于这种表示,原始代码是否在操作数堆栈上使用临时局部变量或dup完全无关紧要,中间表示将是相同的。

所以javac没有提供任何控制这种结构的字节代码表示的选项,但无论如何都没关系。