2013-05-10 122 views
21

我正在通过递增/递减运算符我遇到过,如果我运行递减形式的循环,在这种情况下,它将以增量形式运行得比同样的循环更快。我期待这两个步骤都会持续相同的时间,因为同样的步骤将会被遵循。我通过网络搜索,但无法找到令人信服的答案。是否由于递减运算符比增量运算符需要更少的时间?为什么递减循环比递增循环运行得更快?

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

你的资源是什么? – alfasin 2013-05-10 06:04:20

+2

很久以前,i> 0的测试比非null值的测试略快,但我严重怀疑这种优化仍然相关。 – 2013-05-10 06:04:52

+2

看到存在的问题和答案: http://stackoverflow.com/questions/8968785/which-loop-has-better-performance-increment-or-decrement/8968842#8968842 – 2013-05-10 06:07:26

回答

43

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

+5

要验证,将循环更改为'for(int i = -100000; i <0; i ++){}'。这消除了这种影响,并减少差异增加与减少(这应该没有区别)。 – Thilo 2013-05-10 06:06:58

+2

为什么0更快? – stinepike 2013-05-10 06:13:53

+7

@StinePike:CPU必须加载2个操作数来比较2个数字。有特殊指令与0比较,所以只有一个操作数必须加载到一个寄存器中。 – jlordo 2013-05-10 06:16:29

4

的Piyush巴德瓦杰

我在网上编译器检测了两个圈,但我的增量循环执行速度更快,然后递减循环。

程序执行取决于许多因素。有时我们在同一台机器上运行相同的程序很多次,我们得到不同的执行时间。所以这取决于很多因素。

查看结果

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

} 

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

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

} 

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

爵士叶夫根尼·Dorofeev给出了一个专家只能给的优秀解释。

最后,您需要考虑CPU的性能。在考虑基准来确定Java应用程序的整体性能时,请记住字节码执行,本机代码执行和图形各自发挥作用。它们的影响取决于具体应用的性质。