在Java中,使用int a = a + 1
和a++
是否有性能差异?
如果有,哪个更好,为什么?您能简要解释一下让我理解吗?
在Java中,使用int a = a + 1
和a++
是否有性能差异?
如果有,哪个更好,为什么?您能简要解释一下让我理解吗?
iinc
指令,作用于变量:
iload_<variable>
iinc <variable>, 1
istore_<variable>
使用堆栈的iadd
指令(这里将变量1
用作存储器):
iload_1
iconst_1
iadd
istore_1
编译器会选择最佳的编译方式。例如,它们之间没有区别,并且语句之间不应该有任何区别-它们都表达了同样的意思-将一个数字加一。public class Test {
public static void main(String[] args) {
int a = 0;
a = a + 1;
a += 1;
a++;
++a;
}
}
这是反汇编代码:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iinc 1, 1 // a = a + 1;
5: iinc 1, 1 // a += 1;
8: iinc 1, 1 // a++;
11: iinc 1, 1 // ++a;
14: return
}
++a
添加更多细节信息? - Azodiousiinc
不需要iload
和istore
吗? - Johannes查看生成的字节码:
public static void main(String[] args) {
int x = 1;
int y = 1;
int z = 1;
int a = 1;
int b = 1;
x = x + 1;
y++;
++z;
a += 1;
b += 2;
}
javap -c classname
)0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: iconst_1
5: istore_3
6: iconst_1
7: istore 4
9: iconst_1
10: istore 5
12: iload_1
13: iconst_1
14: iadd
15: istore_1
16: iinc 2, 1
19: iinc 3, 1
22: iinc 4, 1
25: iinc 5, 2
28: return
因此,使用(jdk1.6.0_18):
x = x + 1
12: iload_1
13: iconst_1
14: iadd
15: istore_1
而
y++;
++z;
a += 1;
iinc
然而,在我的笔记本电脑上进行了一次粗略的性能测试,结果两者之间的运行时间几乎没有区别(有时++x更快,有时x=x+1更快),因此我不会担心性能方面的影响。
java -int ...
运行以关闭JIT编译。) - Stephen C不会有明显的区别。使用你觉得最易读的方式(通常是 a++
)。
代码优化的第一条规则:不要优化。
a+=1
至少在我的角度来看更加稳定,无论是可读性还是容错性。你有没有评估过 a+++b
(在Java和C++中)?唯一支持 a++ 的论点是不同的处理器指令,但这已经被JVM优化了。 - fyra++
时,才不会有赋值。在这种情况下,增量是在分配之前还是之后完成并不重要:不存在赋值。这就是 OP 的问题:a = a + 1
还是 a++
? - JB Nizet++a
比 a++
更快,因为后缀运算符必须创建一个临时变量.. 请考虑它们的实现:a = a + 1;
return a;
后缀表达式:
int tmp = a;
a = a + 1;
return tmp;
a++更快。它转换为汇编的INC命令。但我认为JVM会优化a=a+1,所以你不需要担心。
这是一样的,而且现在编译器优化应该不需要关注这些东西,要提高性能,请检查其他更大的问题,比如分配内存等 :)