双重for循环语句块的优化

    双重循环语句的书写,是有讲究的。不同的书写方式,效率会大不一样。有如下代码模块:

    typename tArray[20][600];

    uint32 uIdxI = 0;   //uint32 is short for unsigned int

    uint32 uIdxJ = 0;

    for (uIdxI = 0; uIdxI < 20; uIdxI++)

    {

        for (uIdxJ = 0; uIdxJ < 600; uIdxJ++)

        {

            tArray[uIdxI][uIdxJ] = ...; //assign value

        }//for, uIdxJ

    }//for, uIdxI

    对于以行优先存储方式的计算机来说,上述双重循环的运行效率最高。首先,现代的CPU的体系架构大多都用了预测分支技术,如果双重循环中外循环次数为nNumA,内循环次数为nNumB,则总体上预测失败次数为2 * nNumA + 2,在保证运行结果无误的前提下要保证外循环次数比内循环次数小。

    其次,现代的计算机体系的存储技术至少都用了局部存储思想,即CPU提取内存的一个位置的数据放到cache中的同时,也会把其附近的数据也提取到cache中,如果内存以行优先存储方式,则提取tArray[0][0]位置的数据的同时,则也会顺便把"tArray[0][1], tArray[0][2], tArray[0][3], tArray[0][4]..."等数据提取出来。

    上面提到了两个原理,其中第二个原理要比第一个原理重要,因为“CPU访问cache的速度要远高于访问内存的速度,一般CPU访问SRAM的速度比访问DRAM快1000倍”,分支预测失败顶多是对指令进行调整,而指令本身就是CPU所有,无需访问速度,但是数据则是在内存中,速度就很慢了。

     所以,如果操作系统对数组的存储方式是以列优先存储方式安排的,则上述代码中内循环应该放到外面去。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值