免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanius
打印 上一主题 下一主题

[C] 哪位达人可以告诉我 为什么说循环效率低? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-10-20 15:37 |只看该作者

这么说话的都是傻比,为了效率是不是要裸奔啊?

如果一定要展开还要循环干什么?
还要内联干什么?
无语
递归效率是低一些是因为函数的频繁调用使用栈存储函数的信息,就像归并排序和快排一样,都是nlog(n),但是实际的速度就是慢一些,原因就是这里
但是我第一次听说要追求效率都展开,如果我给你一个无穷级数求和
是不是也要展开啊?
不要为了效率裸奔!

论坛徽章:
0
32 [报告]
发表于 2008-10-21 18:06 |只看该作者
执行循环时,cpu需要执行跳转语句,当循环次数很大时,cpu执行的大多是跳转指令,所以降低了cpu的使用效率。

论坛徽章:
0
33 [报告]
发表于 2008-10-21 18:38 |只看该作者
数组按行存储是个问题,涉及cache命中
跳转指令执行次数也是一个问题
for(i=0;i<10;i++)
    for(j=0;j<1000;j++)
         a[ i][j]++;
跳转指令执行次数有10010次


for(i=0;i<1000;i++)
    for(j=0;j<10;j++)
        a[ i][j]++;

跳转指令有11000次
效率相差有10%左右,显然这个效率基本不涉及cache(因为涉及数据很少)

某些同志不要那么不自信噻,其实你也发现问题了的!

论坛徽章:
0
34 [报告]
发表于 2008-10-21 18:49 |只看该作者

回复 #1 duanius 的帖子

编译器在处理循环的时候是会作循环展开以及分支预测执行的,以便极大的使计算机的指令达到流水线的效果。
建议您如果有时间可以考虑看看 张晨曦先生写过的一本绿色皮的书。里面大量的讲到了流水线的原理。

也就是说你写的循环如果能做到让编译器很容易的去展开并流水的话效率就不会很低的。

简单一点,就是循环里尽量少写或者不写if。循环的执行效率就会上去。

这个涉及到分支与循环使用时候的一个博弈,呵呵。

[ 本帖最后由 samon_fu 于 2008-10-22 01:08 编辑 ]

论坛徽章:
0
35 [报告]
发表于 2008-10-21 21:34 |只看该作者
点错了
循环效率不低,就是重复次数多

[ 本帖最后由 prolj 于 2008-10-21 22:17 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2008-10-21 22:27 |只看该作者
效率和代码可读性都需要关注,但鱼和熊掌不可兼得,不同的应用场景侧重点不同。
如何权衡好这两方面还是很重还要的。

论坛徽章:
0
37 [报告]
发表于 2008-10-22 15:10 |只看该作者
根据局部性原理,使用循环效率会提高。

论坛徽章:
0
38 [报告]
发表于 2008-10-24 16:10 |只看该作者
原帖由 jerrymy 于 2008-10-22 15:10 发表
根据局部性原理,使用循环效率会提高。

局部快不一定全局就快,况且现在有多流水线、多核,情况更复杂了。
最好还是针对特定的环境优化。

论坛徽章:
0
39 [报告]
发表于 2008-10-25 11:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
40 [报告]
发表于 2008-10-25 11:48 |只看该作者
别在这些所谓的细枝末节上过于纠缠

撇开compiler谈优化基本上都是扯淡。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP