CSAPP-perflab-smooth实验报告

PERFLAB实验报告

【实验目的】优化smooth函数。 【函数介绍】

Rotate:将图片逆时针旋转90°。 Smooth:用3*3的窗进行图片的均值滤波。

【程序优化】

Smooth: 1.1初始代码:

void naive_smooth(int dim, pixel *src, pixel *dst) {

int i, j;

for (i = 0; i < dim; i++) }

代码频繁调用avg函数,avg函数也频繁调研initialize_pixel_sum、sccumulate_sum、assign_sum_to_pixel函数。应该减少函数调用的时间开销。因此将所有函数都写在smooth内部,不再调用avg。

像素点分成图片四个角、图片四条边、图片内部三块分别进行处理。对角而言只需要4个像素点的均值,对于边而言为6个像素点均值,图片内部则需要9个像素点均值。

如图所示图片内部对于每行相邻的像素点A、B,滤波时其6个像素块重叠(绿色),对B而言,完全可以用上一步处理A后所得到的值,仅需加上B右边3个像素点(蓝色),并减去A多余的像素点(红色)即可。 每次所需要的数据由9个变为7个。

1.2改动代码:

void smooth(int dim, pixel *src, pixel *dst) {

dst[0].red=(src[0].red+src[1].red+src[dim].red+src[dim+1].red)>>2; //用\代替\节省时间 >2;

dst[dim*dim-1].red=(src[dim*dim-1].red+src[dim*dim-2].red+src[(dim-1)*dim-1].red+src[(dim-1)*dim-2].red)>>2; dst[dim*dim-1].blue=(src[dim*dim-1].blue+src[dim*dim-2].blue+src[(dim-1)*dim-1].blue+src[(dim-1)*dim-2].blue)>>2; dst[dim*dim-1].green=(src[dim*dim-1].green+src[dim*dim-2].green+src[(dim-1)*dim-1].green+src[(dim-1)*dim-2].green)>>dst[(dim-1)*dim].green=(src[(dim-1)*dim].green+src[(dim-1)*dim+1].green+src[(dim-2)*dim].green+src[(dim-2)*dim+1].green)>>2;

dst[(dim-1)*dim].red=(src[(dim-1)*dim].red+src[(dim-1)*dim+1].red+src[(dim-2)*dim].red+src[(dim-2)*dim+1].red)>>2; dst[(dim-1)*dim].blue=(src[(dim-1)*dim].blue+src[(dim-1)*dim+1].blue+src[(dim-2)*dim].blue+src[(dim-2)*dim+1].blue)>dst[dim-1].red=(src[dim-1].red+src[dim-2].red+src[dim*2-2].red+src[dim*2-1].red)>>2; dst[dim-1].blue=(src[dim-1].blue+src[dim-2].blue+src[dim*2-2].blue+src[dim*2-1].blue)>>2; dst[dim-1].green=(src[dim-1].green+src[dim-2].

>>闂備浇顕х换鎺楀磻閻愯娲冀椤愶綆娼熼梺纭呮彧缁犳垹绮堥崒鐐寸厪濠电姴绻樺顕€鏌f惔顖涘<<
12@gma联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4