返回信息流执行效率问题:
int row,col,sum;
int a[100][5];
for(row=0;row <100;row++) 效率低于 for(col=0;col <5;col++)
{ {
for(col=0;col <5;col++) for(row=0;row <100;row++)
{ {
sum = sum+a[row][col]; sum = sum+a[row][col];
} }
} }
请问为什么?
这是一条镜像帖。来源:北邮人论坛 / cpp / #25789同步于 2009/7/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
for循环效率问题
xintai
2009/7/2镜像同步42 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个要看编译出来的代码中数组是行优先还是列优先,不过一般默认都是行优先
【 在 xintai (心态) 的大作中提到: 】
: 执行效率问题:
: int row,col,sum;
: int a[100][5];
: ...................
http://topic.csdn.net/u/20071206/20/5ae1a8f9-fab5-443c-a2ea-af1d755f5de1.html
【 在 xintai (心态) 的大作中提到: 】
: 执行效率问题:
: int row,col,sum;
: int a[100][5];
: ...................
我觉得可能是分页分块的问题吧。。。
【 在 xintai (心态) 的大作中提到: 】
: 执行效率问题:
: int row,col,sum;
: int a[100][5];
: ...................
数组的访问顺序,先行后列肯定优于先列后行(如3楼说的,我们假设行优先)
有如下一个数组,假设内存页大小为4096
int a[100][1024]
先行后列:每一行独占一个内存页,完成循环需要的页面调度次数为100
先列后行:每次都需要调度,完成访问需要的调度次数为 100*1024.(实际中应小于这些)
lz问题中为 a[100][5]
5*100*4 =2000
应该在两个页内.
【 在 xintai (心态) 的大作中提到: 】
: 标 题: for循环效率问题
: 发信站: 北邮人论坛 (Thu Jul 2 22:43:28 2009), 站内
:
: 执行效率问题:
: int row,col,sum;
: int a[100][5];
: for(row=0;row <100;row++) 效率低于 for(col=0;col <5;col++)
: { {
: for(col=0;col <5;col++) for(row=0;row <100;row++)
: { {
: sum = sum+a[row][col]; sum = sum+a[row][col];
: } }
: } }
:
:
: 请问为什么?
: --
:
: ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 2001:da8:215:1740:84d0:1e39:f232:*]
只要数据在内存里,抛开cpu cache不谈,无论怎么读速度都是一样的(除非内存是NUMA,或者数据还不在内存里,需要从磁盘读)
页面调度是什么意思?难道是说CPU打算读一块内存时还需要调度一下?直接读就完了
这个问题就是cpu cache miss的问题..
【 在 huitailang (我爱吃羊,哞~~~咩。。) 的大作中提到: 】
: 标 题: Re: for循环效率问题
: 发信站: 北邮人论坛 (Fri Jul 3 08:20:23 2009), 站内
:
: 数组的访问顺序,先行后列肯定优于先列后行(如3楼说的,我们假设行优先)
: 有如下一个数组,假设内存页大小为4096
: int a[100][1024]
:
: 先行后列:每一行独占一个内存页,完成循环需要的页面调度次数为100
:
: 先列后行:每次都需要调度,完成访问需要的调度次数为 100*1024.(实际中应小于这些)
:
: lz问题中为 a[100][5]
: 5*100*4 =2000
:
: 应该在两个页内.
:
:
:
:
: 【 在 xintai (心态) 的大作中提到: 】
: : 标 题: for循环效率问题
: : 发信站: 北邮人论坛 (Thu Jul 2 22:43:28 2009), 站内
: :
: : 执行效率问题:
: : int row,col,sum;
: : int a[100][5];
: : for(row=0;row <100;row++) 效率低于 for(col=0;col <5;col++)
: : { {
: : for(col=0;col <5;col++) for(row=0;row <100;row++)
: : { {
: : sum = sum+a[row][col]; sum = sum+a[row][col];
: : } }
: : } }
: :
: :
: : 请问为什么?
: : --
: :