大数组的访问效率问题

剑影 2013-06-03 11:20:48
bool ** ppb;
bool * pb;
ppb=(bool**)malloc(sizeof(bool*)*1000000);
for(i=0;i<1000000;i++)
{
pb=(bool*)malloc(sizeof(bool)*100);
ppb[i]=pb;
。。。
}
对这个1000000*100的数组(占用100M内存)进行频繁的随机访问,如访问ppb[i][j]时,只要i是变化的,效率会比较小的数组(比如1000*100)要低很多倍。
请问这是什么原因,这个问题有方法解决吗?
...全文
329 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
剑影 2013-06-05
  • 打赏
  • 举报
回复
引用 6 楼 FancyMouse 的回复:
>对这个1000000*100的数组(占用100M内存)进行频繁的随机访问,如访问ppb[i][j]时,只要i是变化的,效率会比较小的数组(比如1000*100)要低很多倍。 用这几年intel的cpu来解释的话,1000*100完全放得下L3,100M完全放不下L3。 解决办法只有改进内存存取模式,别这么大范围的随机读。
大范围的随机读也是无可奈何的事啊
FancyMouse 2013-06-04
  • 打赏
  • 举报
回复
>对这个1000000*100的数组(占用100M内存)进行频繁的随机访问,如访问ppb[i][j]时,只要i是变化的,效率会比较小的数组(比如1000*100)要低很多倍。 用这几年intel的cpu来解释的话,1000*100完全放得下L3,100M完全放不下L3。 解决办法只有改进内存存取模式,别这么大范围的随机读。
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
 char *ppb;
 ppb=(bool*)malloc(sizeof(char)*1000000*100);
 if (NULL==ppb) exit(1);
 for(i=0;i<1000000;i++)
 {
     memset(ppb+i*100,0,100);
 }
赵4老师 2013-06-03
  • 打赏
  • 举报
回复
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快
剑影 2013-06-03
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
CPU 的缓存命中率低了
谢谢,唉,这么说是没办法了
www_adintr_com 2013-06-03
  • 打赏
  • 举报
回复
CPU 的缓存命中率低了
剑影 2013-06-03
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快
这些情况不是我说的这个问题啊,还有下面的代码这个应该不能解决问题吧。。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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