社区
数据结构与算法
帖子详情
关于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--)
通过效率上的比较方案二要好于方案一。
个人认为他们的差异主要是在方案一每次是和一个大数做比较,而方案二是和零做比较。
计算机在处理这两种时做的是减法,处理起来方案二比较快。
以上是个人认为,放到这和大家共同讨论。
...全文
831
14
打赏
收藏
关于for循环是用i++还是i--效率探讨
通常我们在编写需要for循环实现的程序时有两种实现方法: 1. for(int i = 0;i=0;i--) 通过效率上的比较方案二要好于方案一。 个人认为他们的差异主要是在方案一每次是和一个大数做比较,而方案二是和零做比较。 计算机在处理这两种时做的是减法,处理起来方案二比较快。 以上是个人认为,放到这和大家共同讨论。
复制链接
扫一扫
分享
转发到动态
举报
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. 至少减少一个寄存器.
练习使用for、while、do while、foreach in等
循环
语句
输出字符三角形 输出背靠背字符三角形 输出字符菱形 输出交替字符倒三角形
Javascript中for
循环
语句的几种写法总结对比
前言 for
循环
我们在js遍历对象或数组时都会有用到了,今天我们一起来看一些关于for
循环
的一些使用例子了,具体的操作细节如下文介绍。 一般写法如下: for(var i = 0;i< arr.length;i
++
) { var a = arr[i]; //... } 这就是一个常见的,正序
循环
的for
循环
。这样写的缺点大家都明白:每次都从arr里取length与i来对比,浪费性能(而且,要是arr的长度是动态变化的,就会出现死
循环
)。改进这个
循环
的办法是用变量保存arr.length: for(var i = 0, al = arr.length;i< al;i
++
) { var
JavaScript:for(var i; i
您可能以为他们现在已经解决了这个问题。 我想确定一下,这是测试。
基于for
循环
中i
++
与
++
i的思考(个人发现)
本文是一篇作者基于常用for
循环
中i
++
和
++
i的如何使用的思考,感兴趣的同学可以来看看。
深入理解
++
i 和 i
++
的区别与性能影响
在编程中,
++
i 和 i
++
作为递增操作符的两种形式,经常被用到。虽然它们都能完成变量的自增,但在不同语言中,它们的工作机制和性能却有些微妙的差异。下面将深入
探讨
Java、C
++
和 JavaScript 中这两者的区别、性能差异以及最佳实践。同时还会
探讨
为什么在 for
循环
中,无论使用
++
i 还是 i
++
,它们的结果都是一样的。
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章