Java中的静态函数内联

Ada*_*zyk 5 java optimization inlining

第一个代码:

public static int pitagoras(int a, int b)
{
    return (int) Math.sqrt(a*a + b*b);
}

public static int distance(int x, int y, int x2, int y2)
{
    return pitagoras(x - x2, y - y2);
}
Run Code Online (Sandbox Code Playgroud)

distance被称为经常.当我编译它javac然后反编译javap -c我得到这个字节码:

public static int pitagoras(int, int);
  Code:
   0:   iload_0
   1:   iload_0
   2:   imul
   3:   iload_1
   4:   iload_1
   5:   imul
   6:   iadd
   7:   i2d
   8:   invokestatic    #24; //Method java/lang/Math.sqrt:(D)D
   11:  d2i
   12:  ireturn

public static int distance(int, int, int, int);
  Code:
   0:   iload_0
   1:   iload_2
   2:   isub
   3:   iload_1
   4:   iload_3
   5:   isub
   6:   invokestatic    #34; //Method pitagoras:(II)I
   9:   ireturn
Run Code Online (Sandbox Code Playgroud)

似乎javac没有优化第二功能,distance.

我认为第二个代码更快:

public static int distance(int x, int y, int x2, int y2)
{
    return (int) Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
}
Run Code Online (Sandbox Code Playgroud)

它的字节码:

public static int distance(int, int, int, int);
  Code:
   0:   iload_0
   1:   iload_2
   2:   isub
   3:   iload_0
   4:   iload_2
   5:   isub
   6:   imul
   7:   iload_1
   8:   iload_3
   9:   isub
   10:  iload_1
   11:  iload_3
   12:  isub
   13:  imul
   14:  iadd
   15:  i2d
   16:  invokestatic    #24; //Method java/lang/Math.sqrt:(D)D
   19:  d2i
   20:  ireturn
Run Code Online (Sandbox Code Playgroud)

它是invokestatic如此之快以至于它与内联静态函数相同吗?为什么javac没有优化呢?或者它实际上是优化的,这两个代码会给出相同的,但我错过了一些东西?

Tom*_*ine 7

javac没有优化.这是JVM实现的工作(通常是HotSpot).

曾经有一些优化,javac但它们使代码复杂化,据称倾向于安排代码,以便HotSpot优化被禁止.

HotSpot优化通常在数千次迭代后动态完成(可配置,默认取决于使用"客户端","服务器"还是分层版本).

javac语言规范需要做一些事情,例如内联常量和组合文字字符串.