Java语言里是i++快还是++i快,为什么,请给出准确的权威的回答...
Java语言里是i++快还是++i快,为什么,请给出准确的权威的回答...
i++ 和 ++i 底层指令是一样,只是用法稍有区别:
i++:先用后加
++i:先加后用
在既可以使用 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个指令,因此速度是一样的