++x 比 Java 中的 x++ 更有效吗?

2022-09-03 03:47:23

在一堂编程课上,教授教我们关于 和 的,x 是一个整数。x++++x

他说,在这种情况下,我们可以把任何一个或,都更有效率(理论上仍然更有效率)。x++++x++x

但我忘了为什么。有人知道吗?这是在Java上。


答案 1

在Java中,它的效率并不高。在递增/递减运算符可能过载的语言中,它可以更有效,但除此之外,性能完全相同。

和 之间的差值是 返回递增之前的值,并返回递增后的值。在代码生成方面,两者都弥补了完全相同数量的指令,至少当您可以互换使用任何一个指令时(如果您不能互换使用它们,则不必担心哪一个更快,您应该选择所需的指令)。唯一的区别是增量指令的放置位置。x++++xx++x++xx

在C++中,类可以重载前缀 () 和后缀 () 运算符。在处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为postfix运算符的语义将返回对象的副本,就像在增量之前一样,即使您不会使用它,而前缀运算符可以简单地返回对修改后的对象的引用(并且上帝知道C++开发人员更喜欢返回引用而不是副本)。这可能是一个考虑优于的原因:如果您养成了使用习惯,那么当您切换到C++时,您可以为自己节省一些轻微的性能问题。但仅在Java的上下文中,两者都是绝对等效的。++xx++++xx++++x

就像上面的评论中的pst一样,我从不使用or的返回值,如果你从来没有这样做过,你可能应该坚持你喜欢的那个。x++++x


答案 2

出于好奇,您可以检查生成的字节码。

此程序:

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,因为它没有副作用。


推荐