社区
C语言
帖子详情
关于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楼的意思好像说第一个效率才高,后一个只是编译效率高???
...全文
1489
42
打赏
收藏
关于for循环的效率问题
林锐的C/C++高级编程中有这么一句话: 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 http://topic.csdn.net/t/20040923/15/3402105.html# 我看得更胡涂了,6,7,8,9,11楼的意思好像说第一个效率才高,后一个只是编译效率高???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
for
循环
嵌套
效率
问题
很多时候具体情况需要具体分析,不能一成不变的说哪一种最好,选择合适的方法才是最好的.两个for
循环
嵌套,怎么做
效率
才高呢?有时候外
循环
大,
效率
高,有时候内
循环
大,
效率
高,
JavaScript中for
循环
的
效率
问题
及相关优化
在JavaScript编程中,for
循环
是一种常用的控制结构,用于重复执行特定的代码块。然而,对于大规模的
循环
或者需要处理大量数据的情况,for
循环
的
效率
可能成为一个关键
问题
。本文将深入探究JavaScript中for
循环
的
效率
问题
,并提供一些相关的优化技巧。
java 增强for
循环
的
效率
问题
偶尔讨论起增强for
循环
是不是
效率
会不如普通的迭代遍历呢。在网上搜索一下这二者的
效率
没有发现一个合理的解释。 示例代码List l = new ArrayList(); l.add("abc"); for(String str:l){ System.out.println(str); } 生成的class文件 new java.util.A
js各种for
循环
的
效率
问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compa...
Java for
循环
避坑指南:破解增强for
循环
失效、嵌套
循环
效率
低
问题
上次我写代码的时候,forEach 里调用了一个可能抛空指针的方法,结果一抛异常整个遍历就停了,后面的元素都没处理,最后还是改成普通 for
循环
加 try-catch 才解决,所以用的时候一定要想清楚需不需要控制
循环
流程~i++){if(list.get(i)==2) list.remove(i);你想想看,每次
循环
都要去计算数组长度,虽然数组长度固定,但如果是遍历集合List,用list.size()的话,要是
循环
里有增删元素的操作,size()的值会实时变,直接就导致
循环
次数不对了!
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章