gpt4 book ai didi

java - Java 中的静态函数内联

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:41 24 4
gpt4 key购买 nike

第一段代码:

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);
}

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

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));
}

及其字节码:

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

难道 invokestatic 快到和内联静态函数一样吗?为什么 javac 没有优化这个?或者也许它实际上已经过优化并且这两个代码会给出相同的结果,但我遗漏了什么?

最佳答案

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

曾经在 javac 中进行了一些优化,但它们使代码复杂化并且据称倾向于安排代码以抑制 HotSpot 优化。

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

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

关于java - Java 中的静态函数内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com