5

所以有人问++算子比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;    
    }
}

输出: 在此处输入图像描述

例子:

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

输出: 在此处输入图像描述

简而言之,a = a + 1issues iload_1, iconst_1, iaddand istore_1, 而其他的只使用iinc.

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

4

2 回答 2

7

流行的理念是javac故意选择不优化生成的代码,而是依靠 JIT 编译器在运行时进行优化。后者对执行环境(硬件架构等)以及代码在运行时的使用方式有更好的信息。

这些天来,我认为您不能仅通过读取字节码就性能得出任何现实的结论。抛开关于过早优化的争论不谈,如果你真的想知道是否有区别,请构建一个微基准并亲自查看。

于 2013-11-13T16:01:17.497 回答
1

值得注意的是,这是特定于编译器的。我发现至少有一个 Eclipse 版本x=x+1的编译方式与x++. 此外,这仅与局部变量有关,因为字段没有类似的字节码指令。它仅适用于类型变量int。所以字节码的影响是相当有限的。它最有可能改善通用for(int i=start; i<limit; i++)模式。在语言方面,它会有所不同,特别是对于a[b()] ++vs.a[b()] = a[b()] + 1等。

于 2013-11-15T18:39:13.690 回答