++x 比 Java 中的 x++ 更有效吗?
2022-09-03 03:47:23
在一堂编程课上,教授教我们关于 和 的,x 是一个整数。x++
++x
他说,在这种情况下,我们可以把任何一个或,都更有效率(理论上仍然更有效率)。x++
++x
++x
但我忘了为什么。有人知道吗?这是在Java上。
在一堂编程课上,教授教我们关于 和 的,x 是一个整数。x++
++x
他说,在这种情况下,我们可以把任何一个或,都更有效率(理论上仍然更有效率)。x++
++x
++x
但我忘了为什么。有人知道吗?这是在Java上。
在Java中,它的效率并不高。在递增/递减运算符可能过载的语言中,它可以更有效,但除此之外,性能完全相同。
和 之间的差值是 返回递增之前的值,并返回递增后的值。在代码生成方面,两者都弥补了完全相同数量的指令,至少当您可以互换使用任何一个指令时(如果您不能互换使用它们,则不必担心哪一个更快,您应该选择所需的指令)。唯一的区别是增量指令的放置位置。x++
++x
x++
x
++x
x
在C++中,类可以重载前缀 () 和后缀 () 运算符。在处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为postfix运算符的语义将返回对象的副本,就像在增量之前一样,即使您不会使用它,而前缀运算符可以简单地返回对修改后的对象的引用(并且上帝知道C++开发人员更喜欢返回引用而不是副本)。这可能是一个考虑优于的原因:如果您养成了使用习惯,那么当您切换到C++时,您可以为自己节省一些轻微的性能问题。但仅在Java的上下文中,两者都是绝对等效的。++x
x++
++x
x++
++x
就像上面的评论中的pst一样,我从不使用or的返回值,如果你从来没有这样做过,你可能应该坚持你喜欢的那个。x++
++x
出于好奇,您可以检查生成的字节码。
此程序:
public static void main(String args[]) {
int i = 1; //bytecode 0, 1
i++; //bytecode 2
++i; //bytecode 5
int a = ++i; //bytecode 8, 11, 12
int b = i++; //bytecode 13, 14, 17
}
生成以下字节码:
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iinc 1, 1
8: iinc 1, 1
11: iload_1
12: istore_2
13: iload_1
14: iinc 1, 1
17: istore_3
18: return
因此,您可以看到,从字节码的角度来看,修复前和修复后运算符是严格相同的(除了操作的顺序)。
如果 JIT 编译了该部分代码,则所有赌注都关闭了。例如,上面的代码可以编译为no-op,因为它没有副作用。