问题已得到解答: java中有没有所谓的“Constant Folding”概念?,但是这个页面中的答案我找不到: https://www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
所以这段代码:
class A
{
public static void main()
{
int x=123;int y=234;int z=345;
int a=x+y+z;
}
}
我使用javap -c来检查汇编代码,它并不是没有做常量折叠优化:
public static void main();
Code:
0: bipush 123
2: istore_0
3: sipush 234
6: istore_1
7: sipush 345
10: istore_2
11: iload_0
12: iload_1
13: iadd
14: iload_2
15: iadd
16: istore_3
17: return
javac好像没有像GCC的O2那样的优化选项,所以如果java编译器做了常量折叠优化,我怎么能看到呢?
Java 编译器确实会执行常量折叠,但前提是您使用文字,或者您在计算中使用的变量是
final
:
class A
{
public static void main()
{
final int x=123;
final int y=234;
final int z=345;
int a=x+y+z;
}
}
编译后,
javap
输出为:
public static void main();
Code:
0: sipush 702
3: istore_0
4: return
但是,Java 编译器不会做太多优化,大部分优化发生在运行时,由 JIT 编译器执行,JIT 编译器使用有关底层平台的信息(例如 CPU 指令集)和实际运行时特征来决定优化和编译原生代码。