关于for循环的效率问题

juzi2010 2007-12-19 11:05:20
林锐的C/C++高级编程中有这么一句话:
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。

http://topic.csdn.net/t/20040923/15/3402105.html#

我看得更胡涂了,6,7,8,9,11楼的意思好像说第一个效率才高,后一个只是编译效率高???
...全文
1433 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-04-14
  • 打赏
  • 举报
回复
挖坟额
pengzhixi 2011-04-14
  • 打赏
  • 举报
回复
额 实际上是提高cache的命中率。
kingdom_0 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 huaxiamoyun 的回复:]

引用 36 楼 chonet2009 的回复:
这帖子从07年到现在一直未结????

楼主很纠结嘛

哈哈 太逗了
时间显示确实如此啊
[/Quote]
这个~
JiuchunYoung 2010-08-05
  • 打赏
  • 举报
回复
这本质上是一个cache问题
如果长循环放在外层,会让cache频繁的更新数据,一起cache的颠簸,原则就是让cache得到最大的使用,避免不停的造成cache miss而去读内存,这样会耗费大量的时间
zjh_msdn 2010-08-05
  • 打赏
  • 举报
回复
切,放哪还不一样都是执行那么多次,数学怎么学的
huaxiamoyun 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 chonet2009 的回复:]
这帖子从07年到现在一直未结????

楼主很纠结嘛
[/Quote]
哈哈 太逗了
时间显示确实如此啊
huaxiamoyun 2010-08-05
  • 打赏
  • 举报
回复
人家讲的真到位
本来我就不知道
以前也没思考过这个问题
看了之后感觉是啊
确实是这样
第一个效率高
又学会了一点儿

顶了
眼睛猥琐男 2010-08-05
  • 打赏
  • 举报
回复
这帖子从07年到现在一直未结????

楼主很纠结嘛
arrowcy 2007-12-24
  • 打赏
  • 举报
回复
关键是考虑cache效率,最好是保证循环体内的内容不会被多次载入和清除cache。有时候为了提高cache命中率,甚至需要把一个循环拆分成两个循环。但是这比简单的循环展开更有效果。毕竟cpu速度是很快的,而内存速度差的太多了,特别是在大量连续数据处理的时候
zhangshunxing 2007-12-23
  • 打赏
  • 举报
回复

想了解更多的技术 请进纯c语言群:49465070
yupaul 2007-12-23
  • 打赏
  • 举报
回复
来凑个热闹,jf
mathe 2007-12-23
  • 打赏
  • 举报
回复
错了,有可能顺序访问比你这样的代码更快。
i)顺序访问下面,硬件会自动对cache进行预取的,不存在等待cachline的时间。
ii)即使硬件没有预取,编译器也可以插入预取指令。而打乱代码只能对编译器的优化造成干扰。
其实如果考虑到编译器可以循环展开,反而可能讲小循环放在里层更好(在循环次数是常量的情况下),因为小循环可以被完全展开。
=================================================================
对于6楼第一段代码 更快的方式可以这么写, 不过6楼的例子实际和楼主说的是完全不一样的意思 6楼只是如何访问memory更快
先取第一个cacheline 32byte的第一个值,再取第二个cacheline 32byte的第一个值 然后再处理第一个cacheline, 这样可以减少等待填充cache的时间 同时也可以减少循环次数
int x[1000][100];
for(i=0;i=1000;i++)
for(j=0;j <100;j+=16)
{
access x[i][0]
access x[i][8]
access x[i][1]
...
access x[i][7]
access x[i][9]
...
access x[i][16]
}
shaoze5 2007-12-23
  • 打赏
  • 举报
回复
星期1了去公司看看
scces 2007-12-23
  • 打赏
  • 举报
回复
up
scces 2007-12-23
  • 打赏
  • 举报
回复
up
sccer 2007-12-22
  • 打赏
  • 举报
回复
up
luqiang1987 2007-12-22
  • 打赏
  • 举报
回复
此问题值得深究,学习啊
sandmangu 2007-12-22
  • 打赏
  • 举报
回复
对于6楼第一段代码 更快的方式可以这么写, 不过6楼的例子实际和楼主说的是完全不一样的意思 6楼只是如何访问memory更快
先取第一个cacheline 32byte的第一个值,再取第二个cacheline 32byte的第一个值 然后再处理第一个cacheline, 这样可以减少等待填充cache的时间 同时也可以减少循环次数
int x[1000][100];
for(i=0;i=1000;i++)
for(j=0;j <100;j+=16)
{
access x[i][0]
access x[i][8]
access x[i][1]
...
access x[i][7]
access x[i][9]
...
access x[i][16]
}
kojie_chen 2007-12-22
  • 打赏
  • 举报
回复
竟然还有跨切这种事呢,多学习硬件的知识还是有好处的,呵呵
yxwsbobo 2007-12-22
  • 打赏
  • 举报
回复
线性存放 命中率

以前从未考虑过
加载更多回复(22)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧