C-关于循环展开对性能的影响?

C-关于循环展开对性能的影响?

泛泛之交 发布于 2017-09-16 字数 421 浏览 1314 回复 3
uint32 sum = 0;
uint32 i= 0;
//@code 1
for (i=0; i<66666; ++i)
{
sum += p[a];
}
//@code 2
for (i=0; i<66666; i+=2)
{
sum += p[a];
sum += p[a+1];
}

//@code 3
for (i=0; i<66666; i+=4)
{
sum += p[a];
sum += p[a+1];
sum += p[a+2];
sum += p[a+3];
}
sum += p[a];
sum += p[a+1];

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-10-29 3 楼

如果只是实现switch-case 非常规用法拾零 (1. 绝无原创 2. 非常重视代码规范者勿入)的效果,下面的实现也可以的:

#define LOOP_UNROLLING_DEPTH 8

uint32 sum = 0;
uint32 i = 0;
uint32 uCount = 6666;
for (i=0;i<uCount&~7; i+=8){
    sum += p[i];
    sum += p[i+1];
    sum += p[i+2];
    sum += p[i+3];
sum += p[i+4]; 
sum += p[i+5];
sum += p[i+6];
sum += p[i+7];
}
for(i=uCount&~7; i<uCount; ++i)
sum += p[i];

但是循环体内还是要对深度做直接操作。

灵芸 2017-09-22 1 楼

循环展开优化是有效果的
实际优化结果结果依赖于编译器以及编译模式
循环展开优化效果还要依赖于硬件,cache大小等对大循环影响很大,在不超过cache大小的情况下循环展开越深优化越大,有必要展开。但是一旦超过cache大小,频繁的cpu切换却会显著降低性能
根据循环次数自动的完成循环展开这个可以尝试用C++的模板类实现,C的就不了解了
循环展开的深度需要考虑循环次数