Java语言里是i++快还是++i快,为什么,请给出准确的权威的回答...

Java语言里是i++快还是++i快,为什么,请给出准确的权威的回答...
Java语言里是i++快还是++i快,为什么,请给出准确的权威的回答...

i++ 和 ++i 底层指令是一样,只是用法稍有区别:

i++:先用后加
++i:先加后用

以下仅个人理解,此点除非具体编译器的实现者,没人能说自己是权威准确的,不同版本的java编译器实现不一定一样


在既可以使用 i++ 也可以使用 ++i 的前提下
如果只有 i++ 或者是 ++i 通常编译器会有自动优化,因此效率是一样的
但 如果有赋值或其他运算,导致编译器无法优化的时候 如(仅举例,以下编译器能否优化依具体实现而定)

 A   a = (i++) + (i++) 
 B   a = (++i) + (++i)

这里通常B会比A更好一点(也就一丁点儿),首先要明白在进行运算的时候,内存中的数据和指令是会被装载到各个寄存器中运行的(速度效率 :寄存器>内存>硬盘)

因为A中(i++)的返回值和变化后的 i 的值是不一样的,而 i 的值(旧值)又即将发生变化,因此要多借助寄存器来保存一个临时结果,即变化之前的 i 值(旧值),因此会有一次寄存器装载操作( i 变化前的内存值>寄存器1 ),但一个寄存器不够,因为这个寄存器已经作为返回值了,需要另一寄存器2 对 i 值进行自增运算,然后将这个寄存器运算后的结果赋值给 i 内存地址
(i 变化前的内存值>寄存器2; 寄存器2自增1;寄存器2的值 -> i 的内存地址)

而B中(++i)变化之后的值和返回的值是一样的,只需要使用一个寄存器变量先保存 i 的值, 然后寄存器自增1,最后将寄存器运算后的结果赋值给 i 的内存地址( i 变化前的内存值 -> 寄存器; 寄存器自增1;寄存器的值 -> i 的内存地址)

总结: A相比B,A用到了2个寄存器,并且多了一次寄存器装载操作,所以说B会更好些

最后: 真的不必太纠结,计算机的运行速度已经完全感受不到这丁点区别了,即便是在一个循环次数很多的大循环里,效率也基本上不会受影响,多研究下设计模式,提升的效率比这个大得多

那首先比运行速度就是比运行代码的行数喽,
java代码最后都是要被翻译的,那其他变量都相同的情况下,反编译上面两种代码的字节码文件,最后得到的,哪个行数少哪个就快呗

定义2个方法,内容很简单:

public static int method1(int i){
        return i++;
    }

    public static int method2(int i){
        return ++i;
    }

查看编译后的字节码:
图片说明
从java底层指令来说,都是3个指令,因此速度是一样的