c语言多重for循环如何优化

optimistiveho 2017-05-18 09:01:20
for(i = sw; i < height - sw; i++)
{
for(j = sw; j < width - sw; j++)
{
sum = 0;
calGaussCoef(pGaussCoef);

for(m = -sw; m <= sw; m++)
{
for(n = -sw; n <= sw; n++)
{
indexI = (i+m)*width + j+n;
indexG = (m+sw)*slen + n+sw;
sum += pSrcImg[indexI] * pGaussCoef[indexG];
}
}
pDstImg[i*width + j] = (unsigned char)(sum);
}
}
...全文
1619 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2020-08-18
  • 打赏
  • 举报
回复
nested for loops can be reduced to one level.
只要循环之间没有额外语句,多少重的循环都可以写成一层的,但是未必一定会更有效,得看情况。
lindorx 2020-01-19
  • 打赏
  • 举报
回复
试了一下,应该可以把上面的四重循环改成二重循环,如下:

int h = height - sw - sw, w = width - sw - sw,num= (sw * 2 + 1);
for (a = 0; a < h * w; a++) {
i = a / h + sw;
j = a % h + sw;
sum = 0;
calGaussCoef(pGaussCoef);
for (b = 0; b < num*num; b++) {
m = b / num - sw;
n = b %num- sw;
indexI = (i + m) * width + j + n;
indexG = (m + sw) * slen + n + sw;
sum += pSrcImg[indexI] * pGaussCoef[indexG];
}
pDstImg[i * width + j] = (unsigned char)(sum);
}
lin5161678 2020-01-08
  • 打赏
  • 举报
回复
先讲一下你的代码准备实现什么效果
寻开心 2020-01-08
  • 打赏
  • 举报
回复
代码上看
1 calGaussCoef(pGaussCoef); 这个是多次重复调用,完全可以扔到循环外面去

2 最内层循环里面的这两句
indexI = (i+m)*width + j+n;
indexG = (m+sw)*slen + n+sw;
乘法完全可以用加法来替代掉

从算法上看, 从一个大图片上取sw*sw的一个小正方形里面的所有像素 和 一个固定的系数矩阵挨个乘法后求和后放到一个新的图像数据去
这个乘法的过程没有重复发生的地方, 算法就无法优化

能优化的是可以考虑利用现代计算机多核的特性做并行计算了, 上述乘法之间的数据彼此之间互不影响,并行计算是可行的
柒贰伍玖 2020-01-08
  • 打赏
  • 举报
回复
循环切换类似函数调用,会涉及到出栈/入栈操作,所以可以通过减少循环切换达到优化 大循环在里面,小循环在外面,减少切换次数 把不是重复操作的指令放到循环外面,减少循环体本身开销
「已注销」 2020-01-08
  • 打赏
  • 举报
回复
引用 1 楼 ck2333 的回复:
两层循环也叫多层?
废话流
赵4老师 2017-05-19
  • 打赏
  • 举报
回复
过早的优化是万恶之源! 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
lin5161678 2017-05-19
  • 打赏
  • 举报
回复
引用 12 楼 optimistiveho 的回复:
引用 9楼bravery36 的回复:
四层就四层,也没有什么大不了的,而且只有优化算法才能减少运算量,这种代码没有什么好优化的,你能想到的编译器早就做了。
但我们老师说还能优化
能 普通变量 改为 寄存器变量 i++ 改为 ++i 换一下内外层循环 简单函数改宏函数 加减乘除计算改用位运算 但都意义不大 这种代码 不改逻辑 真想优化是 自己动手嵌入汇编
optimistiveho 2017-05-19
  • 打赏
  • 举报
回复
引用 9楼bravery36 的回复:
四层就四层,也没有什么大不了的,而且只有优化算法才能减少运算量,这种代码没有什么好优化的,你能想到的编译器早就做了。
但我们老师说还能优化
自信男孩 2017-05-19
  • 打赏
  • 举报
回复
优化的策略是:内大外小,即循环次数是内层大,外层小;
自信男孩 2017-05-19
  • 打赏
  • 举报
回复
优化的策略是:内大外小,即循环次数是内存大,外层小; http://blog.csdn.net/caolipeng_918/article/details/38453761
bravery36 2017-05-19
  • 打赏
  • 举报
回复
四层就四层,也没有什么大不了的,而且只有优化算法才能减少运算量,这种代码没有什么好优化的,你能想到的编译器早就做了。
optimistiveho 2017-05-19
  • 打赏
  • 举报
回复
引用 6楼lin5161678 的回复:
[quote=引用 5 楼 optimistiveho 的回复:] [quote=引用 4楼ckc 的回复:]把外层可以计算的尽可能放到外层,减少在内层的运算, 比如indexI = (i+m)*width + j+n; 就可以把 (i+m)*width + j 放到一个临时变量里,在外层就计算好,这样在n循环的时候就只计算 indexl=临时变量+n 不过这个是小技巧,有些编译器也许会帮你处理过了
先谢谢,如果将两个for变成用一个for和一个if来判断行不行呢,怎么样改[/quote]只调整循环层次没意义 影响效率的是循环次数 没办法降低循环次数 考虑修改循环层数 大部分是炫技游戏[/quote]大神,要是我把去掉第四层的话可以吗
lin5161678 2017-05-19
  • 打赏
  • 举报
回复
引用 1 楼 qq_36409192 的回复:
两层循环也叫多层?
仔细看是四层 ps 没缩进是楼主的问题了
lin5161678 2017-05-19
  • 打赏
  • 举报
回复
引用 5 楼 optimistiveho 的回复:
[quote=引用 4楼ckc 的回复:]把外层可以计算的尽可能放到外层,减少在内层的运算, 比如indexI = (i+m)*width + j+n; 就可以把 (i+m)*width + j 放到一个临时变量里,在外层就计算好,这样在n循环的时候就只计算 indexl=临时变量+n 不过这个是小技巧,有些编译器也许会帮你处理过了
先谢谢,如果将两个for变成用一个for和一个if来判断行不行呢,怎么样改[/quote]只调整循环层次没意义 影响效率的是循环次数 没办法降低循环次数 考虑修改循环层数 大部分是炫技游戏
optimistiveho 2017-05-19
  • 打赏
  • 举报
回复
引用 4楼ckc 的回复:
把外层可以计算的尽可能放到外层,减少在内层的运算, 比如indexI = (i+m)*width + j+n; 就可以把 (i+m)*width + j 放到一个临时变量里,在外层就计算好,这样在n循环的时候就只计算 indexl=临时变量+n 不过这个是小技巧,有些编译器也许会帮你处理过了
先谢谢,如果将两个for变成用一个for和一个if来判断行不行呢,怎么样改
ckc 2017-05-19
  • 打赏
  • 举报
回复
把外层可以计算的尽可能放到外层,减少在内层的运算, 比如indexI = (i+m)*width + j+n; 就可以把 (i+m)*width + j 放到一个临时变量里,在外层就计算好,这样在n循环的时候就只计算 indexl=临时变量+n 不过这个是小技巧,有些编译器也许会帮你处理过了
optimistiveho 2017-05-18
  • 打赏
  • 举报
回复
有没有大神帮忙
optimistiveho 2017-05-18
  • 打赏
  • 举报
回复
引用 1楼ck2333 的回复:
两层循环也叫多层?
然后呢,怎么优化
ck2333 2017-05-18
  • 打赏
  • 举报
回复
两层循环也叫多层?

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧