循环展开
【说明】 通过将循环中多个连续的指令组合到一个循环中去完成来节省工作,从而减少循环的总迭代次数,减少控制循环的指令执行的次数。另外,针对循环次数较小的场景,在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;
}
父主题: 控制语句