双重for循环语句块的优化

来源:互联网 发布:淘宝最美女店主 编辑:程序博客网 时间:2024/05/01 07:25

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

    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所有,无需访问速度,但是数据则是在内存中,速度就很慢了。

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

原创粉丝点击