免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-10-17 17:14 |只看该作者
原帖由 cugb_cat 于 2008-10-17 17:10 发表
跳转太多容易使CPU的指令预测系统失效,使得CPU缓存的代码失效,需要重新从内存中读取代码,在嵌入式系统上,对这个要求比较多。

版主大哥说得比较在理,这个我也能理解

论坛徽章:
0
12 [报告]
发表于 2008-10-17 17:17 |只看该作者
原帖由 cugb_cat 于 2008-10-17 17:10 发表
跳转太多容易使CPU的指令预测系统失效,使得CPU缓存的代码失效,需要重新从内存中读取代码,在嵌入式系统上,对这个要求比较多。

哦 原来这样  
这个代码是指指令流水线么  ?

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
13 [报告]
发表于 2008-10-17 17:17 |只看该作者
算了,以后大家直接用ASM写程序

论坛徽章:
0
14 [报告]
发表于 2008-10-17 17:22 |只看该作者
原帖由 duanius 于 2008-10-17 17:17 发表

哦 原来这样  
这个代码是指指令流水线么  ?

差不多吧,就是CPU一次要从内存中读入多条指令,这样可以减少CPU和内存的交互次数。
还有就是对于数据也有这种要求,一个二维数组,遍历该数组的方法不同,效率也不同,虽然都是两层循环,也就是:

  1. int a[1000][10000];
  2. for (i = 0; i < 1000; ++i)
  3.      for (j = 0; j < 10000; ++j)
  4.              k = a[i][j];
复制代码



  1. for (i = 0; i < 10000; ++i)
  2.      for (j = 0; j < 1000; ++j)
  3.              k = a[j][i];
复制代码

这两个代码的执行效率是不同的,当a很大的时候,效率差别是非常明显的。

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

回复 #14 cugb_cat 的帖子

我来猜猜,前一种应该效率更高吧

论坛徽章:
0
16 [报告]
发表于 2008-10-17 17:32 |只看该作者
不好意思  有些愚拙  看了半天 不是很确定哪种更好 惭愧。。。

论坛徽章:
0
17 [报告]
发表于 2008-10-17 17:33 |只看该作者
原帖由 雨过白鹭洲 于 2008-10-17 17:31 发表
我来猜猜,前一种应该效率更高吧

跳转数都是一样的 是因为内循环一次读入更多么?

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

回复 #16 duanius 的帖子

第二种是跳跃式地访问内存,这样就降低了CPU对内存数据的缓存效果,因为CPU读取内存时也是一整块一整块地读取以提高效率

论坛徽章:
0
19 [报告]
发表于 2008-10-17 17:36 |只看该作者
因为数组在内存中是按行存放的,所以按行来访问,效率更高,因为CPU的缓存(也就是intel说的那些1 2级缓存)会预读一部分数据,按行访问数组,可以保证CPU缓存具有很高的命中率,从而大大提高速度。

论坛徽章:
0
20 [报告]
发表于 2008-10-17 17:37 |只看该作者
原帖由 雨过白鹭洲 于 2008-10-17 17:34 发表
第二种是跳跃式地访问内存,这样就降低了CPU对内存数据的缓存效果,因为CPU读取内存时也是一整块一整块地读取以提高效率

哦 第二个跳跃式了  没注意到  
我想的是 一个外循环1000 内循环10000  一个外循环10000 一个内循环1000     效率上有无区别   如果不考虑跳跃式  都连续访问内存的话
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP