C++-如何写for循环语句,能使效率达到最高

发布于 2016-11-13 04:47:33 字数 124 浏览 2348 评论 13

例如
for (int i = 0, h = arr.Count; i < h; i++)

for (int i = 0; i < arr.Count; i++)
等等的一些写法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

想挽留 2017-10-10 03:59:51

说说我自己的一些想法,首先是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了,其他的技巧一时半会就想不出来了。

泛泛之交 2017-10-10 01:36:49

使用++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)会高效很多,

灵芸 2017-09-02 00:05:45

对于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就不要返回了)

虐人心 2017-08-24 05:23:03

我也认为第一种好 仅仅需要把i++换做++i

归属感 2017-06-12 08:08:28

for()循环的三个参数和时间效率有比较大的影响的基本是第2个参数,尽量判断语句用闭区间比开区间好一点,比如 i<=n 比 i<n+1 要好一点,不要用算式在判断语句中 ( length = arr.Count i<=length;)

最后就是循环中尽量能剪枝的就减枝,毕竟效率方面少做循环才是王道!

虐人心 2017-06-06 12:59:33

先说下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的,性能非常低下.

偏爱自由 2017-05-19 20:42:41

补充一点:

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,然后被使用,它只有一个动作

归属感 2017-05-08 17:03:53

其实我想说,对于如何编写高效的for循环程序,其实没必要纠结于那些什么i++和++i,当然这个纠结也有价值,但是总的来说付出和收获不对等。

一般情况下建议使用!=替换<,使用++i替换i++;虽然这个问题,不同的编译器是否会进行优化,或者说优化到什么程度,这个不好说。另外,对于for等之类的循环来说,一般情况下这些情况所消耗的性能基本可以忽略,我们应该将重点放置在for循环内部
普遍的经验是将for等循环内的东西能提取到循环外的就提取出来,尽量保持循环最小化的原则进行程序编写。

晚风撩人 2017-03-02 09:50:03

其实for循环效率的优化可以考虑的写法主要还是:for循环的嵌套,最长循环放在内部可以提高效率, 循环的展开一定程度上可以提高效率,可以参考这个问题的解答 @关于循环展开对性能的影响?

想挽留 2017-02-11 16:29:20

i++和++i都是这个循环执行结束的时候才会执行的,对于效率应该没有影响吧

瑾兮 2017-01-05 06:47:51

for (int i = arr.Count-1, i>=0 ;i--)
arr.Count也是1次
与常量比较比与变量比较要快

浮生未歇 2016-12-18 14:11:33

这个问题,以前看过一点,在循环里,最基本的用++i而不是i++,其次做一些循环展开效率会高一些,看问题: @关于循环展开对性能的影响?

偏爱自由 2016-11-26 04:07:05

其实上面的说的for(obj:集合)是增强for循环,是jdk1.5后的新特性,
针对 使用for循环的。如果是使用String字符操作,那么就最好使用增强for循环。。
效率问题 差别很大。大家有时间可以去试试

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文