两层嵌套for循环的效率比较

情况一:两层for循环,外层循环次数为1000000,内层循环次数为10。

情况二:两层for循环,内层循环次数为1000000,外层循环次数为10。


正常情况下,次数多的循环放在内层,会减少cache更新数据的次数,当离开内层循环的时候会恢复外层的计数器,外层循环次数越少,恢复计数器的次数越少,效率较高,由此看来情况二更加高效。

从cpu指令执行机制上来分析,因为基本所有cpu都有分支指令预测,所以如果有10次循环,只有第一次和最后一次可能预测失败。如果外层循环为A次,则预测失败的次数为2*A+2,所以外层循环次数少的情况效率更高,和上面分析一致。

情况总有峰回路转的时候,考虑下面两个情况

// 1
for(i=0;i<100000;i++)
  for(j=0;j<10;j++)
    a[i,j]=0;
//2
for(i=0;i<10;i++)
  for(j=0;j<100000;j++)
    a[j,i]=0;
事实证明第一种情况更快。

因为cpu从内存中获取到数据存放到cache的时候,是一块一块获取的,如果cache的利用率高,那么效率肯定更高。因为第一个代码对数组a的访问是顺序的,所以换页次数更少,时间开销更小。

由此看来,对两种情况的分析并不是绝对的,效率应该由三种分析共同决定。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值