关于for循环是用i++还是i--效率探讨

Torres 2012-03-26 02:56:52

通常我们在编写需要for循环实现的程序时有两种实现方法:

1. for(int i = 0;i<arr.length;i++)

2. for(int i = arr.length-1;i>=0;i--)

通过效率上的比较方案二要好于方案一。

个人认为他们的差异主要是在方案一每次是和一个大数做比较,而方案二是和零做比较。
计算机在处理这两种时做的是减法,处理起来方案二比较快。

以上是个人认为,放到这和大家共同讨论。
...全文
817 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wood87654321 2012-03-29
  • 打赏
  • 举报
回复
所以结论就是:如果arr.length需要变化则使用++,否则使用--。

至于把arr.length保存到静态变量,前一种情况下不可能,后一种情况下则没必要
NeedHelper 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shenzebang 的回复:]

你用arr.length的话,每次比较都要去读取arr.length这个值的。所以会比较慢,你吧这个值保存到一个const 变量里,然后再做回比较快,这个时候这个变量被当做编译常量。既快又安全。
[/Quote]

一旦保存到常量中就不能实时检测到arr长度的变化,只能用同步的方法做控制。
wzhiyuan 2012-03-28
  • 打赏
  • 举报
回复
浏览器js 里写的话,经实测
1,for(int i = 0;i<arr.length;i++) 最耗时,

2,for(int i=0,len=list.size();i<len;i++) 次之,

3, for(int i = arr.length-1;i>=0;i--) 最快

和大家的分析完全一致
1,最耗时不需多言,
2与3 基本上差距在10%之内

-- 与 0比较这点听了大家的分析,很长见识
Credo_ 2012-03-27
  • 打赏
  • 举报
回复

for(int i=0,len=list.size();i<len;i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

最近刚看到的.
yxhshuaiman 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shenzebang 的回复:]
你用arr.length的话,每次比较都要去读取arr.length这个值的。所以会比较慢,你吧这个值保存到一个const 变量里,然后再做回比较快,这个时候这个变量被当做编译常量。既快又安全。
[/Quote]

这个说法我认为对
shenzebang 2012-03-27
  • 打赏
  • 举报
回复
你用arr.length的话,每次比较都要去读取arr.length这个值的。所以会比较慢,你吧这个值保存到一个const 变量里,然后再做回比较快,这个时候这个变量被当做编译常量。既快又安全。
shenzebang 2012-03-27
  • 打赏
  • 举报
回复
似乎的确会这样。。[Quote=引用 8 楼 needhelper 的回复:]

两种方法在性能上差别不会很大,第二种写法会存在这样的漏洞,当在循环时arr的长度发生变化却无从得知。
[/Quote]
NeedHelper 2012-03-27
  • 打赏
  • 举报
回复
两种方法在性能上差别不会很大,第二种写法会存在这样的漏洞,当在循环时arr的长度发生变化却无从得知。
mathe 2012-03-26
  • 打赏
  • 举报
回复
只有:
1. arr.length可能会变化, 所以有可能比较时每次都要从arr里面取length的值.
是一个问题。
对于各楼上提到的其它"问题",均不是问题,编译器完全可以智能处理
lxtqq163 2012-03-26
  • 打赏
  • 举报
回复
Window下代码要转成机器代码,机器代码太繁琐,我们可以近似的用汇编语言来分析。
汇编下循环指令LOOP,它循环时 寄存器的值是递减的。
顶层转换到底层时,用++的方式理论上说会别扭,要多耗时间。
david-yue 2012-03-26
  • 打赏
  • 举报
回复
i- -操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。
i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志,这对于i < n的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。
david-yue 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fire_woods 的回复:]

1. arr.length可能会变化, 所以有可能比较时每次都要从arr里面取length的值.
2. 很多cpu和0比较可以减少1个指令.
3. 至少减少一个寄存器.
[/Quote]
i- -操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。
i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志,这对于i < n的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。
fire_woods 2012-03-26
  • 打赏
  • 举报
回复
1. arr.length可能会变化, 所以有可能比较时每次都要从arr里面取length的值.
2. 很多cpu和0比较可以减少1个指令.
3. 至少减少一个寄存器.

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧