显然,在我的带有 HotSpot JDK 1.7.0 _ 45(所有编译器/VM 选项都设置为默认)的 Windows 8笔记本电脑上,下面的循环
final int n = Integer.MAX_VALUE;
int i = 0;
while (++i < n) {
}
至少比下列数量级快2倍(约10毫秒比约5000毫秒) :
final int n = Integer.MAX_VALUE;
int i = 0;
while (i++ < n) {
}
我在编写用于评估另一个不相关性能问题的循环时碰巧注意到了这个问题。++i < n
和 i++ < n
之间的差异足以显著影响检测结果。
如果我们查看字节码,更快版本的循环体是:
iinc
iload
ldc
if_icmplt
慢一点的版本是:
iload
iinc
ldc
if_icmplt
因此,对于 ++i < n
,它首先将局部变量 i
增加1,然后将其推送到操作数堆栈上,而 i++ < n
按相反的顺序执行这两个步骤。但这似乎无法解释为什么前者要快得多。在后一种情况下是否有临时副本?或者是字节码之外的东西(VM 实现、硬件等)应该对性能差异负责?
我已经阅读了一些关于 ++i
和 i++
的讨论(尽管不是详尽的) ,但是没有找到任何特定于 Java 的答案,也没有找到任何与 ++i
或 i++
参与值比较的情况直接相关的答案。