Java编译器是否进行常量折叠优化以及如何检查它?

问题描述 投票:0回答:1

问题已得到解答: 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 compiler-construction
1个回答
0
投票

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 指令集)和实际运行时特征来决定优化和编译原生代码。

© www.soinside.com 2019 - 2024. All rights reserved.