++ x比Java中的x ++更有效吗?
在编程课程中,教授教我们x++
和++x
,x是整数。
他说,在这种情况下,我们可以放置x++
或++x
, ++x
更有效(虽然很少,但理论上仍然更有效)。
但我忘记了原因 。 有谁知道? 这是Java。
它在Java中效率不高。 在递增/递减运算符可能过载的语言中,它可以更有效,但其他方面的性能完全相同。
x++
和++x
之间的区别在于x++
在递增之前返回++x
的值,而++x
在递增之后返回++x
的值。 在代码生成方面,两者都弥补了完全相同数量的指令,至少当你可以互换使用时(如果你不能互换使用它们,你不应该担心哪一个更快,你应该是选择你需要的那个)。 唯一的区别是放置增量指令的位置。
在C ++中,类可以重载前缀( ++x
)和后缀( x++
)运算符。 当处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为后缀运算符的语义将返回对象的副本,就像它在增量之前一样,即使你不使用它,前缀运算符可以简单地返回对修改对象的引用(并且上帝知道C ++开发人员更喜欢返回引用而不是副本)。 这可能是考虑++x
优于x++
一个原因:如果你养成使用++x
的习惯,当你/切换到C ++时,可以节省一些轻微的性能问题。 但仅在Java的上下文中,两者都是绝对等价的。
与上面的注释中的pst非常相似,我从不使用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编译代码的那部分,那么所有的赌注都会被取消。 例如,上面的代码可以编译为无操作,因为它没有副作用。
问题的真相是,在PDP-11上, *x++
比C中的 *++x
快,可能是VAX,因为它编译为单个指令(自动递增寄存器延迟)。 同样地, *--x
比*x--
快。 如果编译器仍然生成该指令,则使用没有解除引用的任一forms只会在一种情况下更快而不是另一种forms,这将是浪费因为仍然会发生取消引用。
那些日子已经一去不回。