社区
数据结构与算法
帖子详情
关于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
打赏
收藏
关于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
您可能以为他们现在已经解决了这个问题。 我想确定一下,这是测试。
javascript for
循环
设法提高性能
让你的for
循环
提升性能的写法,需要的朋友可以参考下。
javascript每日必学之
循环
朋友们大家好,今天,我们继续接着前面的内容讲,前们我们已经讲了条件分支,今天我们就讲
循环
,顾名思义就是,重复执行相同的操作,正常
循环
是受程序控制的,不正常的情况,就会出现死
循环
,那就是我们的代码中出现bug,那样,我们还要学会调式bug,等我们先把基础知识讲完了之后,我还会专门用篇幅来讲解浏览器里面的调试,那种程序就会在我们掌控之中,这才是我们想要结果。
循环
包括的结构体有 for , while , do–while,for
循环
有两种形式的存在,一种是数字变量变化所引起的
循环
,另一种就是for…in形式,是属性或者下标所引起的
循环
变化,但for…in不是关键,关键还是for,例如在C#语
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章