优化1:
一个看到有个函数avg,回想一下书上的例子,减少函数调用算是一个优化,于是就把avg的内容直接写在循环体里面
char smooth_descr[] = "smooth: Current working version";
void smooth(int dim, pixel *src, pixel *dst)
{
int i, j;
for (i = 0; i < dim; i++)
for (j = 0; j < dim; j++)
{//不调用avg函数,把avg函数中的内容写在循环体中,把计算结果赋值给dst
int ii,jj;
pixel_sum sum;
pixel current_pixel;
initialize_pixel_sum(&sum);
for(ii = max(i-1, 0); ii <= min(i+1, dim-1); ii++)
for(jj = max(j-1, 0); jj <= min(j+1, dim-1); jj++)
accumulate_sum(&sum, src[RIDX(ii, jj, dim)]);
assign_sum_to_pixel(¤t_pixel, sum);
dst[RIDX(i,j,dim)] = current_pixel;}
}
我们可以看到avg内部还是有很多函数调用,所以可以预见到这个优化应该是没啥用的:)
看下结果:
快了0.3,聊胜于无
优化2:
既然avg函数里面还有啰嗦的函数,那我们直接放弃avg函数里面的思想,按照需要实现的功能自己写一下试试。
定义一个函数,功能是求一个矩阵区域分别三种颜色的和,并把得到的和除以指定的num。因为num只有三种可能:四个角落的num是4,第一行,第一列和最后一行,最后一列非角落的格子的num是6,中间部分的num是9,这样就减少了原来对num的存储和运算。
char smooth2_descr