显然在我的Windows 8笔记本电脑上使用HotSpot JDK 1.7.0_45(所有编译器/ VM选项都设置为默认值),下面的循环
final int n = Integer.MAX_VALUE;
int i = 0;
while (++i < n) {
}
Run Code Online (Sandbox Code Playgroud)
比以下情况快至少2个数量级(~10 ms vs.~5000 ms):
final int n = Integer.MAX_VALUE;
int i = 0;
while (i++ < n) {
}
Run Code Online (Sandbox Code Playgroud)
在编写循环以评估另一个不相关的性能问题时,我碰巧注意到了这个问题.之间的差异++i < n
和i++ < n
是巨大的,足以显著影响结果.
如果我们查看字节码,更快版本的循环体是:
iinc
iload
ldc
if_icmplt
Run Code Online (Sandbox Code Playgroud)
而对于较慢的版本:
iload
iinc
ldc
if_icmplt
Run Code Online (Sandbox Code Playgroud)
因此++i < n
,它首先将局部变量递增i
1,然后将其推入操作数堆栈,同时i++ < n
以相反的顺序执行这两个步骤.但这似乎并不能解释为什么前者要快得多.后一种情况是否涉及临时副本?或者是否应该负责性能差异的字节码(VM实现,硬件等)以外的东西?
我已经阅读了一些关于++i
和i++
(但并非详尽无遗)的其他讨论,但未找到任何特定于Java的答案,并且与价值比较中涉及++i
或i++
涉及的情况直接相关.
java performance compiler-optimization pre-increment post-increment