问题已经得到了回答: is there any concept called "Constant Folding" in java?,但这一页的答案我找不到: 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并且已使用常量表达式进行了初始化时(请参阅JLS的4.12.4. final Variables15.29. Constant Expressions等).

修改代码以使xyz成为最终结果:

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编译器使用有关底层平台的信息(例如,CPU指令集)和实际的运行时特征来决定优化并将代码编译为本机代码.

同样值得注意的是:如果您也进入了a期末,那么它也将从字节码中删除:

  public static void main();
    Code:
       0: return

Java相关问答推荐

Selenium Java:无法访问IFRAME内部的元素

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

Java Streams在矩阵遍历中的性能影响

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

基于调车场算法的科学计算器

Jakarta CDI强制bean构造/注册遗留事件侦听器

测试容器无法加载类路径初始化脚本

MySQL数据库中未应用具有Spring数据的唯一约束

Java ArrayList的整数和数组的泛型

GetChildren().emoveAll()不会删除 node

为什么我的回收视图会显示重复的列表?

是否为计划任务补偿系统睡眠?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

使用SWIG将C++自定义单元类型转换为基本Java类型

为什么项目名称出现在我的GET请求中?

整数->;双取消框,但双->;int不';t开箱.为什么?

放置在变量中的Java成员引用不相等

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

类型安全:从 JSONArray 到 ArrayList> 的未经判断的转换