鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

多重循环,地址偏移小且次数多的循环放到内层

【说明】 对于多维数组来说,其低维的地址偏移小,如果以此为循环内层,可以提升缓存的利用率。对于for循环,内层循环更多,则展开的语句执行的次数更少。

【原理】 通过减少执行语句,提升数据局部性来提升运行效率。

【注意事项】 只在各层循环次数相差很大的情况下,需要考虑循环层次次序,若相差不大,则更应该照顾指令/数据等其他因素,甚至优先考虑可维护性等非性能维度。【案例】

优化前
    for (j = 0; j < 1000; j++) {    // j<1000和j++相关代码分别执行1000次
        for (i = 0; i < 10; i++) {  // 1)i = 0代码执行1000次;2)i<10和i++相关代码分别执行10\*1000次
            sum += a[i][j];         // sum += a[i][j]代码执行10\*1000次
        }
    }
优化后
    for (i = 0; i < 10; i++) {          // i<10和i++相关代码分别执行10次
        for (j = 0; j < 1000; j++) {    // 1)j = 0代码执行10次;2)j<1000和j++相关代码分别执行1000*10次
            sum += a[i][j];             // sum += a[i][j]代码执行1000*10次
        }
    }

说明 :可见内层循环越多,执行的语句更少;同时,由于C/C++语言数组是行优先顺序存储,如果按照第二种方式遍历,由于后续的16个数组(以cacheline=64Byte为例)元素都加载到了cache中,可以显著提升运行效率。