于是有人问Is the ++ operator more efficient than a=a+1?前阵子。我以为我之前分析过这个,最初说a = a + 1
和增量运算符++
没有区别。事实证明,a++
、++a
和 a += 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 + 1
产生 iload_1
、iconst_1
、iadd
和 istore_1
,而其他人只使用 iinc
。
我试图合理化这一点,但我做不到。在这种情况下,编译器是否不够智能以优化字节码?这些不同有充分的理由吗?这是由 JIT 处理的吗?除非我对此有错误的解释,否则我似乎永远不应该使用 a = a + 1
,我认为这肯定只是一种风格选择。
最佳答案
普遍的理念是 javac
有意选择不优化生成的代码,依靠 JIT 编译器在运行时进行优化。后者具有关于执行环境(硬件架构等)以及代码在运行时如何使用的更好信息。
如今,我认为您无法仅通过阅读字节码就性能得出任何现实的结论。关于过早优化的争论放在一边,如果你真的想知道是否有区别,construct a micro-benchmark并亲自看看。
关于java - 各种增量运算符 vs 赋值和自增分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958459/