社区
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楼的意思好像说第一个效率才高,后一个只是编译效率高???
...全文
1433
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
循环
效率
?
一般是三个方法: 1)预分配 即在for
循环
前,将输出结果矩阵预先分配。例如: a=[0 0 0]; for i=1:3 a(i)=i; end 这样在 for
循环
中,就不会在内存中,每次对变量a进行再分配了。 2)矢量化 MATLAB 中,矩阵运算会比 for
循环
效率
更高,例如对一个矩阵的所有元素求 sin 值,并不需要用 for
循环
,直接: a=[1 2 3] b=sin(a) 这样就避免了对 a 中的每个元素进行 for
循环
。 3)并行化 使用 parfor,将 for
循环
的运算量交给多个线
java 解决双重for
循环
效率
问题
解决双重for
循环
效率
问题
题目说明题解 题目说明 当拥有2个表时,订单表和物品表 时,订单表(客户名称,订单ID)和物品表(订单ID,物品名称)一个客户可以购买多个物品,但是他们的订单ID是唯一的,数据库中数据以JSON字符串的形式传给你。 订单表 订单ID 客户名称 A 1 B 2 C 3 … … 物品表 订单ID 物品名称 A 1 B 2 C 3 … … 请输出购买最多商品的人?购买最少商品的人?和平均一个人购买多少商品。 题解 1.解决
关于普通for
循环
和增强for
循环
什么时候使用普通for
循环
,什么时候使用增强for
循环
首先,增强for
循环
的写法比普通for
循环
简便,不过我们还得考虑
效率
。 --->首先,我们先看结论: 对于基本数组类的遍历,两者的
效率
是相同的; 对于ArrayList的遍历,普通for
循环
的
效率
高于增强for
循环
; 对于LinkedList的遍历,增强for
循环
的
效率
高于普通for
循环
。 --->然后,我们来看...
C++ for
循环
效率
优化
C++ for
循环
效率
优化 背景 今天看到同事的代码,commit message说要提高
循环
效率
,但是看起来非常浪费时间,我就想试一下for
循环
怎么写运行最快,发现还是非常有意思的。 首先是编译选项,在X86系统编译Release,优化等级-O3,关闭gdb SET(CMAKE_BUILD_TYPE "Release") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") 这个
循环
非常简单,遍历一个结构体的vector,读一下数据执行一些操作
多线程解决for
循环
效率
问题
在for里面,如果执行一次for里面的内容所需时间比较长,可以使用线程池来提高for
循环
的
效率
;public class TreadFor { private static final int loopNum = 1*10; public static void main(String args[]) throws InterruptedException { ...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章