java - 各种增量运算符 vs 赋值和自增分析

标签 java bytecode

于是有人问Is the ++ operator more efficient than 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;    
    }
}

输出: enter image description here

例子:

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

输出: enter image description here

简而言之,a = a + 1 产生 iload_1iconst_1iaddistore_1 ,而其他人只使用 iinc

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

最佳答案

普遍的理念是 javac 有意选择不优化生成的代码,依靠 JIT 编译器在运行时进行优化。后者具有关于执行环境(硬件架构等)以及代码在运行时如何使用的更好信息。

如今,我认为您无法仅通过阅读字节码就性能得出任何现实的结论。关于过早优化的争论放在一边,如果你真的想知道是否有区别,construct a micro-benchmark并亲自看看。

关于java - 各种增量运算符 vs 赋值和自增分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19958459/

相关文章:

java - 找出使用了给定 API 的哪些类

java - 由于编译的类文件中缺少调试信息而导致的 Paranamer 错误

java - JAXB:对具有相同值的不同 XML 元素进行解码

java - Elasticsearch 扩展内部文档数组

actionscript-3 - 任何调试 ActionScript ByteCode 的工具?想观察寄存器、堆栈

java - 字节码生成的访问对象与 GenerationMethodAccessor

java - 这些 Java 字节偏移量是如何计算的?

使用信号量的 Java 男女通用浴室程序 - 逻辑问题

java - SQLException pg_get_serial_sequence 未找到

java/jackson - @JsonValue/@JsonCreator 和 null