在 java 的 for 循环中进行预增量与后增量相比是否更高效?
示例代码:
for (int i=0; i<10; i++)
和
for (int i=0; i<10; ++i)
我注意到,当我进行预增量时,执行时间比我进行后增量时要短。关于为什么会出现这种情况的任何建议?谢谢。
在 java 的 for 循环中进行预增量与后增量相比是否更高效?
示例代码:
for (int i=0; i<10; i++)
和
for (int i=0; i<10; ++i)
我注意到,当我进行预增量时,执行时间比我进行后增量时要短。关于为什么会出现这种情况的任何建议?谢谢。
我编译了一个最小的例子(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
除非您的循环体几乎什么都不做,否则这个问题没有实际意义:变量增量的开销为零。即使开销很突出,它的大小也是完全不可预测的,并且即使在完全相同的硬件上完全相同的 JVM 的不同实例之间也会有很大的不同。当然,“狂野”变化在 0..2 ns 范围内。
后增量和预增量(或减量)基本上意味着如果您使用诸如 ++i 之类的预增量,则在该代码行的其余部分之前对其进行评估。如果使用诸如 i++ 之类的后增量,则在代码行的其余部分之后对其进行评估。这也许就是您获得“更快执行时间”的原因。
基于此,不存在这样的性能问题。两者在性能方面完全相同。并且您无法声称应该使用 ++i 代替 i++,这取决于我们要处理的逻辑。++i 表示先递增然后开始工作,而 i++ 表示开始工作然后递增。看看以下问题。
后自增 (i++) 和前自增 (++i) 运算符如何在 Java 中工作?
语言无关示例:循环中 i++ 和 ++i 之间的区别?