C++-如何写for循环语句,能使效率达到最高
例如
for (int i = 0, h = arr.Count; i < h; i++)
和
for (int i = 0; i < arr.Count; i++)
等等的一些写法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
例如
for (int i = 0, h = arr.Count; i < h; i++)
和
for (int i = 0; i < arr.Count; i++)
等等的一些写法
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(13)
说说我自己的一些想法,首先是for (int i = 0, h = arr.Count; i < h; i++)
和
for (int i = 0; i < arr.Count; i++)这两种写法,应该是第一种比较好,因为arr.Cout第一个只需计算一次,而第二种方法在每次判断时都需要计算arr.Count。
至于其他的在写for循环时要注意的我常遇到的就是遍历集合,我一般写成 for(obj : 集合)这样就不用判断集合是否为null了,其他的技巧一时半会就想不出来了。
使用++i代替i++的形式, 这个原因很明显
终止条件使用i != arr.Count 代替 i < arr.Count的形式, 使用!=位运算,而<需要做减法,显然位运算更快点,个人理解
如果arr.Count循环时是不变的,可以使用一个变量存储起来,int nCount = arr.Count;
总结 for (int i = 0; i < arr.Count; i++) 替换成 for (int i = 0; i != nCount; ++i)会高效很多,
对于for (int i = 0, h = arr.Count; i < h; i++)和for (int i = 0; i < arr.Count; i++):
1.用一个变量h存储边界arr.Count,可以减少计算量,但是这是保证arr.Count不变的情况下的,也就是说,数组arr大小不变。
2.用++i比用i++效率更高,因为i++需要返回自增前的值(比如:i=5;i++需要先返回5,然后在自增,++i就不要返回了)
我也认为第一种好 仅仅需要把i++换做++i
for()循环的三个参数和时间效率有比较大的影响的基本是第2个参数,尽量判断语句用闭区间比开区间好一点,比如 i<=n 比 i<n+1 要好一点,不要用算式在判断语句中 ( length = arr.Count i<=length;)
最后就是循环中尽量能剪枝的就减枝,毕竟效率方面少做循环才是王道!
先说下C# 的吧
刚好前几天和同事说这个事情的时候验证过.
for (int i = 0, h = arr.Count; i < h; i++)
与
for (int i = 0; i < arr.Count; i++)
在非常巨大的请求量下会有区别.
测试是10w的List或者Array,然后循环10次,大概是一倍的差距.
Javascript的请使用务必使用第一种写法,因为第二种会导致每次都计算count的,性能非常低下.
补充一点:
i++ 与++i的实质:
i++
可以这样理解:i++,在被使用时,做了两个动作,先产生一个副本,然后本来的i(非副本)等于i的副本加1,然后使用i的副本。这个性质对当i是某个迭代器或指针是很有作用。
比如:iterator pos;erase(pos);pos++;这样做会error,因为pos在erase(pos)是被移除了,它就变成了一个“野的迭代器”;正确的写法是:iterator pos;erase(pos++);因为在移除之前,pos生成了一个副本pos0,然后执行pos=pos0+1指向下一个元素了,然后在移除pos的副本pos0。
更正一下:erase(pos++)这样写是不对的,我的理解是:在两个序列点中pos变化了两次,第一次移除,第二次自加;所以错了。个人理解是:pos++,在产生副本后被使用时不能被修改(只能使用)。
2.++i
++i:直接加1,然后被使用,它只有一个动作
其实我想说,对于如何编写高效的for循环程序,其实没必要纠结于那些什么i++和++i,当然这个纠结也有价值,但是总的来说付出和收获不对等。
一般情况下建议使用!=替换<,使用++i替换i++;虽然这个问题,不同的编译器是否会进行优化,或者说优化到什么程度,这个不好说。另外,对于for等之类的循环来说,一般情况下这些情况所消耗的性能基本可以忽略,我们应该将重点放置在for循环内部。
普遍的经验是将for等循环内的东西能提取到循环外的就提取出来,尽量保持循环最小化的原则进行程序编写。
其实for循环效率的优化可以考虑的写法主要还是:for循环的嵌套,最长循环放在内部可以提高效率, 循环的展开一定程度上可以提高效率,可以参考这个问题的解答 @关于循环展开对性能的影响?
i++和++i都是这个循环执行结束的时候才会执行的,对于效率应该没有影响吧
for (int i = arr.Count-1, i>=0 ;i--)
arr.Count也是1次
与常量比较比与变量比较要快
这个问题,以前看过一点,在循环里,最基本的用++i而不是i++,其次做一些循环展开效率会高一些,看问题: @关于循环展开对性能的影响?
其实上面的说的for(obj:集合)是增强for循环,是jdk1.5后的新特性,
针对 使用for循环的。如果是使用String字符操作,那么就最好使用增强for循环。。
效率问题 差别很大。大家有时间可以去试试