软件工程实验八
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验八:代码优化
一、试验目的:
1. 熟悉掌握代码优化的常规手段;
二、实验要求
1. 以word文档形式提交实验报告,无需压缩;
2. 文档包括:优化措施说明、优化后的程序、优化前后执行时间的截图。
三、实验内容
1. 阅读下面的C程序,优化代码效率(时间效率),给出优化前后的时间对比,要求:速度提高100倍及以上。
代码见文件“ImGaussConv.cpp”,滤波窗口尺寸在本应用场景下是固定的(为5*5)。
for(j = -SUPPORT_SIZE; j <= SUPPORT_SIZE; j++)
{
//计算高斯系数,2.71828为自然数e
pGaussCoef[ (i+SUPPORT_SIZE)*wlen + j+SUPPORT_SIZE ] = pow( 2.71828, (-double(i*i + j*j)/25) );
}
}
for(k = 0; k < wlen*wlen; k++)
{
sum += pGaussCoef[k];
}
for(k = 0; k < wlen*wlen; k++) //进行归一化处理
{
pGaussCoef[k] /= sum;
}
}
}
// 2维卷积函数,实现2维图像高斯滤波
// pGaussCoef为高斯系数
// pSrcImg为原始图像
// pDstImg为滤波后图像
// height:图像高度
// width:图像宽度
// supportSize:高斯滤波窗口半径,直径为2*supportSize + 1
void conv2D(double *pGaussCoef, unsigned char *pSrcImg, unsigned char *pDstImg, int height, int width, int supportSize)
{
int i, j;
int m, n;
int indexI, indexG;
int sw = supportSize;
int slen = sw*2 + 1;
double sum;
double *pTemp = NULL;
pTemp = new double[height*width];
for(i = 0; i < height*width; i++)
{
pTemp[i] = (double)pSrcImg[i];
}
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);
}
}
}
int main()
{
int wlen, imLen;
time_t start, end;
double *pGaussCoef = NULL;
unsigned char *pSrc = NULL, *pDst = NULL;
unsigned char buffer[1078];
FILE *fin, *fout;
if( !(fin=fopen("in.bmp","rb")) )
{
printf("Open file %s error!\n","in.bmp");
return 0;
}
if( !(fout=fopen("out.bmp","wb")) )
{
printf("Open file %s error!\n","out.bmp");
return 0 ;
}
wlen = SUPPORT_SIZE * 2 + 1;
imLen = IM_WIDTH * IM_HEIGHT;
pGaussCoef = new double[wlen*wlen];
pSrc = new unsigned char[IM_WIDTH*IM_HEIGHT];
pDst = new unsigned char[IM_WIDTH*IM_HEIGHT];
fread(buffer, 1, 1078, fin);
fread(pSrc, sizeof(unsigned char), imLen, fin);
start = clock();
conv2D(pGaussCoef, pSrc, pDst, IM_HEIGHT, IM_WIDTH, SUPPORT_SIZE);
end = clock();
printf("running time is %d\n", end - start);
fwrite(buffer, sizeof(unsigned char), 1078, fout);
fwrite(pDst, sizeof(unsigned char), imLen, fout);
delete[] pGaussCoef;
delete[] pSrc;
delete[] pDst;
fclose(fin);
fclose(fout);
}
删除了一些不必要的循环,修改了一些参数