0

在 java 的 for 循环中进行预增量与后增量相比是否更高效?

示例代码:

for (int i=0; i<10; i++)

for (int i=0; i<10; ++i)

我注意到,当我进行预增量时,执行时间比我进行后增量时要短。关于为什么会出现这种情况的任何建议?谢谢。

4

4 回答 4

10

我编译了一个最小的例子(Oracle jdk1.7.0_07):

public void post() {
    for (int i=0; i<10; i++) {

    }
}

public void pre() {
    for (int i=0; i<10; ++i) {

    }
}

两种方法都产生了完全相同的字节码:

 0 iconst_0
 1 istore_1
 2 goto 8 (+6)
 5 iinc 1 by 1
 8 iload_1
 9 bipush 10
11 if_icmplt 5 (-6)
14 return
于 2013-02-27T15:16:13.177 回答
3

除非您的循环体几乎什么都不做,否则这个问题没有实际意义:变量增量的开销为零。即使开销很突出,它的大小也是完全不可预测的,并且即使在完全相同的硬件上完全相同的 JVM 的不同实例之间也会有很大的不同。当然,“狂野”变化在 0..2 ns 范围内。

于 2013-02-27T15:14:51.253 回答
0

后增量和预增量(或减量)基本上意味着如果您使用诸如 ++i 之类的预增量,则在该代码行的其余部分之前对其进行评估。如果使用诸如 i++ 之类的后增量,则在代码行的其余部分之后对其进行评估。这也许就是您获得“更快执行时间”的原因。

于 2013-02-27T15:14:20.840 回答
0

基于此,不存在这样的性能问题。两者在性能方面完全相同。并且您无法声称应该使用 ++i 代替 i++,这取决于我们要处理的逻辑。++i 表示先递增然后开始工作,而 i++ 表示开始工作然后递增。看看以下问题。

后自增 (i++) 和前自增 (++i) 运算符如何在 Java 中工作?

语言无关示例:循环中 i++ 和 ++i 之间的区别?

于 2013-02-27T17:49:41.410 回答