为什么递减循环比递增循环运行更快?

22

我正在学习自增/自减运算符,然后发现如果我以递减的形式运行循环,它会比同样的递增形式运行得更快。 我本以为两种方式需要相同的时间,因为都会执行相同数量的步骤。我在网上搜索了很多但没有找到令人信服的答案。这是因为递减运算符需要比递增运算符更少的时间吗?

for(int i = 100000; i > 0; i--) {}
for(int i = 1; i < 100001; i++) {}

1
你的资源是什么? - Nir Alfasi
2
很久以前,i>0比与非空值的比较稍微快一些,但我严重怀疑这种优化是否仍然相关。 - Denys Séguret
2
查看现有的问题和答案:https://dev59.com/s2ox5IYBdhLWcg3wyXRx#8968842 - Jeremy Unruh
1
我看不到任何证据表明这会有任何影响。在上述两种情况下,循环都将被优化为无效代码。 - Peter Lawrey
2个回答

44
这是因为在字节码比较中,与0进行比较与与非零数字进行比较是不同的操作。实际上,i < 10001需要先将数字加载到堆栈上,然后执行比较,而i > 0则作为一个操作执行。当然,在大多数情况下由于JVM优化,不会有速度差异。但我们可以尝试通过使用-Xint选项(仅解释器模式执行)运行代码来使其可见。

5
为了验证这一点,将循环改为 for(int i = -100000; i < 0; i++) {}。这样可以消除这种影响,并将差异减少到递增与递减之间(这不应该有影响)。 - Thilo
8
CPU需要加载两个操作数来比较两个数字。有一些特殊的指令可以用来与0进行比较,因此只需要将一个操作数加载到寄存器中即可。 - jlordo
@StinePike 我对我的答案进行了一些澄清。 - Evgeniy Dorofeev
@Evgeniy Dorofeev 先生,您的解释非常好!给您点赞。 - Nikhil Agrawal
您可以通过比较以下内容来验证 Evgeniy 的答案。在以下情况下,性能将相同。 for(int i = 100000; i > 1; i--) {} for(int i = 2; i < 100001; i++) {} - Jack
显示剩余3条评论

4

Piyush Bhardwaj

我在在线编译器上测试了两个循环,但是我的增量循环比递减循环执行得更快。

程序的执行取决于许多因素。有时候在同一台机器上运行相同的程序多次会得到不同的执行时间。因此,它取决于许多因素。

请查看结果

for(int i = 1; i < 100001; i++) {

}

增量循环 -- http://ideone.com/irdY0e

for(int i = 100000; i > 0; i--) {

}

递减循环 -- http://ideone.com/yDO9Jf

Evgeniy Dorofeev先生提供了一个只有专家才能给出的优秀解释。

最后,需要考虑您的CPU的性能。在考虑基准测试以确定Java应用程序的整体性能时,请记住字节码执行、本地代码执行和图形各自发挥作用。它们的影响因特定应用程序的性质而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接