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

发布于 2017-09-16 12:17:47 字数 421 浏览 1427 评论 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];

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(3

想挽留 2017-10-29 19:32:10

如果只是实现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 22:17:41

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文