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没有优化呢?或者它实际上是优化的,这两个代码会给出相同的,但我错过了一些东西?
javac没有优化.这是JVM实现的工作(通常是HotSpot).
曾经有一些优化,javac但它们使代码复杂化,据称倾向于安排代码,以便HotSpot优化被禁止.
HotSpot优化通常在数千次迭代后动态完成(可配置,默认取决于使用"客户端","服务器"还是分层版本).
javac语言规范需要做一些事情,例如内联常量和组合文字字符串.
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |