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

循环展开

【说明】 通过将循环中多个连续的指令组合到一个循环中去完成来节省工作,从而减少循环的总迭代次数,减少控制循环的指令执行的次数。另外,针对循环次数较小的场景,在gcc编译器下,可以考虑采用#pragma GCC unroll n的方式,对已知循环次数的小循环进行编译阶段展开;

【原理】 循环展开可以减少循环控制代码中的指令数,并启用更多编译器优化,发挥CPU并发处理能力。需要注意的是,展开过多会导致指令缓存的高miss。

【注意事项】 循环展开可能导致生成的指令数增加,从而导致代码段增大,针对循环体内的复杂处理,需要权衡代码段与性能收益后决策;

【案例】

优化前
int Calc(int *array, int bound)
{
    int sum = 0;
    for (int i = 0; i < bound; ++i) {
        sum += array[i];
    }
    return sum;
}
优化后
int Calc(int *array, int bound)
{
    int sum = 0;
    int boundOpt = (bound >> 2) << 2;
    for (int j = 0; j < boundOpt; j += 4) {
        sum += array[j];
        sum += array[j + 1];
        sum += array[j + 2];
        sum += array[j + 3];
    }
    for (int i = boundOpt; i < bound; ++i) {
        sum += array[i];
    }
    return sum;
}