分析各种增量运算符与赋值和递增

Ste*_* P. 5 java bytecode

所以有人问过++运算符比a = a + 1更有效吗?前阵子.我以为我之前分析了这个,并且最初说a = a + 1和增量运算符之间没有区别++.事实证明,a++,++aa += 1所有编译到相同的字节,但a = a + 1确实没有,因为可以看到下面:

public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a++;
        a += 1;
        ++a;    
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: 在此输入图像描述

例:

public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a = a + 1;
        a++;
        a += 1;
        ++a;    
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: 在此输入图像描述

总之,a = a + 1问题iload_1,iconst_1,iaddistore_1,而其他人只能使用iinc.

我试图将其合理化,但我无法做到.在这种情况下,编译器是不是足够智能来优化字节码?这些是不同的有充分理由吗?这是由JIT处理的吗?除非我正确地解释这个,否则我似乎永远不会使用a = a + 1,我认为这肯定只是一种风格选择.

NPE*_*NPE 7

流行的哲学是javac故意选择不优化生成的代码,依赖于JIT编译器在运行时执行此操作.后者有更好的有关执行环境(硬件架构等)的信息,以及如何在运行时使用代码.

这些天,我认为只要阅读字节码就可以得出任何关于性能的现实结论.关于过早优化的争论除外,如果你真的想知道是否存在差异,可以构建一个微基准测试并亲自看看.