for循环效率问题整理

 

问:下面哪种写法,循环语句的效率更高?

 

for (row=0; row<100; row++)

{

for ( col=0; col<5; col++ )

{

sum = sum + a[row][col];

}

}

for (col=0; col<5; col++ )

{

for (row=0; row<100; row++)

{

    sum = sum + a[row][col];

}

}

(a)长循环在最外层                        (b)长循环在最内层

答:C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如(b)的效率比(a)的高。

网友提问:

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。  
  ---------------------------------  
  CPU跨切循环层是什么意思,CPU是怎么做的?  
  它究竟是个什么东西呢?

       ?????????????????????????????????  
          ?                                                              ?  
          ?      有一个问题是:我们知道数组中的数据是先按行再按列存放的。?  
          ?   比如在计算数组和时,如果把列放在内层(仅管是长循环),在扫 ?  
          ?   描元素时,不是连续读取,而是跳读的,会不会又影响了效率呢? ?  
          ?                                                              ?  
          ?????????????????????????????????

高手的回答:

你知道CPU指令流水线和指令、数据的Cache命中的概念吗?如果你的“跳读”会跨越cache交换块,甚至page边界的话,就会造成CPU数据cache重新批量装载数据,甚至从虚拟内存中恢复磁盘数据,这当然严重影响效率。

这个“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量。  
  但是另一方面还要注意数据结构本身的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值