社区
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楼的意思好像说第一个效率才高,后一个只是编译效率高???
...全文
1450
42
打赏
收藏
关于for循环的效率问题
林锐的C/C++高级编程中有这么一句话: 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 http://topic.csdn.net/t/20040923/15/3402105.html# 我看得更胡涂了,6,7,8,9,11楼的意思好像说第一个效率才高,后一个只是编译效率高???
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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里面,如果执行一次for里面的内容所需时间比较长,可以使用线程池来提高for
循环
的
效率
;public class TreadFor { private static final int loopNum = 1*10; public static void main(String args[]) ...
js FOR
循环
效率
问题
引:每个接触JS的开发人员都不可避免的与for
循环
打交道,毕竟这是遍历必不可少的工具之一。然而当
循环
次数比较大时,
效率
问题
必须重视。在群众,站长提出了这个话题,回去好好想了下,整理出来,大家一起讨论讨论。 ...
如何提高 for
循环
效率
?
即在for
循环
前,将输出结果矩阵预先分配。例如: a=[0 0 0]; for i=1:3 a(i)=i; end 这样在 for
循环
中,就不会在内存中,每次对变量a进行再分配了。 2)矢量化 MATLAB 中,矩阵运算会比 for
循环
效率
更高,例如对一...
java 解决双重for
循环
效率
问题
解决双重for
循环
效率
问题
题目说明题解 题目说明 当拥有2个表时,订单表和物品表 时,订单表(客户名称,订单ID)和物品表(订单ID,物品名称)一个客户可以购买多个物品,但是他们的订单ID是唯一的,数据库中数据以...
C++ for
循环
效率
优化
C++ for
循环
效率
优化 背景 今天看到同事的代码,commit message说要提高
循环
效率
,但是看起来非常浪费时间,我就想试一下for
循环
怎么写运行最快,发现还是非常有意思的。 首先是编译选项,在X86系统编译Release,...
C语言
70,020
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章