如何通过优化代码来提高程序运行效率?(续)

书接上回。

我们今天主要继续谈谈如何通过优化代码来提高程序的运行效率的一些具体的优化建议:

5. 避免不必要的存储器访问

程序的运行速度取决于计算机硬件。而在计算机硬件中,CPU的运行速度是超快的,与之相比,运行缓慢的存储器会拖累CPU,从而导致整个程序运行速度都慢下来。因此,我们应当尽量避免不必要的存储器引用,特别是不让它出现在一些敏感区域,比如循环体中。

6. 使用循环展开技术

所谓循环展开就是通过在每次迭代中执行更多的数据操作,减少迭代次数,以降低循环开销。

比如下面图像取反色处理的功能函数。其中,参数int width表示图像的宽(以像素计),参数int height表示图像的高(以像素计),参数BYTE * pixel是待处理的像素数组,而参数BYTE * tempPixel用来存储结果图像。

void Negative(BYTE * pixel, BYTE * tempPixel, int width, int height)
{
int i = 0;
int sum = width * height * 4;
memcpy(pixel, tempPixel, sum);
for(i = 0; i < sum; i++)
{
tempPixel[i] = 255 - tempPixel[i];
}
}

虽然这个函数中循环体部分非常简单,但是它的循环开销却非常大。如果采用循环展开的方式来重构上面的函数,会将循环次数变为了原来的三分之一,像下面这样:

void Negative(BYTE * pixel, BYTE * tempPixel, int width, int height)
{
int i = 0;
int sum = width * height * 4;
memcpy(pixel, tempPixel, sum);
for(i = 0; i < sum; i+=3)
{
tempPixel[i] = 255 - tempPixel[i];
tempPixel[i+1] = 255 - tempPixel[i+1];
tempPixel[i+2] = 255 - tempPixel[i+2];
}
}

7. 查表替换复杂运算

为了减少开销,程序中的一些复杂运算应当只进行一次。比如:

float percentage(int * array, int length, int parameter1, int parameter2,)
{
int sum = 0;
int i;
int * p;
p = array;
for(i = 0; i<length; i++)
{
if(*p> parameter1* parameter2-500 && *p< parameter1* parameter2+500)
sum++;
p++;
}
return (float)sum/(float)length;
}

这段代码中,算式parameter1* parameter2-500和parameter1* parameter2+500被反复地用到。为了避免重复进行计算,可以事先算出结果赋予某变量,在需要时直接调用就好了。像下面这样:

float percentage(int * array, int length, int parameter1, int parameter2,)
{
int sum = 0;
int i;
int * p;
p = array;
int maxsize = parameter1* parameter2+500;
int minsize = parameter1* parameter2-500;
for(i = 0; i<length; i++)
{
if(*p> minsize && *p < maxsize)
sum++;
p++;
}
return (float)sum/(float)length;
}

8. 循环体中避免耗时计算

因为循环体中的程序代码会被执行多次,所以应当尽量减少其中的耗时计算。

例如下面这个将图像的所有像素点的颜色都变为35的函数:

void Function(BYTE * pixel, int width, int height)
{
int i, j;
for(i = 0; i < height; i++)
for(j = 0; j < width; j++)
*(pixel + i * width + j) =35;
}

我们将计算量较大的运算完全移出循环体,就会极大地降低循环开销,像下面这样:

void Function(BYTE * pixel, int width, int height)
{
int i, j;
BYTE * p;
p = pixel;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
*( p++ ) =35;
p += width;
}
}

这正是:

效率提高有方法,需要优化好代码

八条建议逐个数,循环开销第一家

参考书目:代码揭秘——从C/C++的角度探秘计算机系统,作者:左飞,出版社:电子工业出版社

作者简介:王小双,长期从事GJB5000推广、实施、评价、改进的工作,创建《软件工程之思》微信公众号,一直在《软件工程之思》分享GJB5000、CMMI、软件工程的知识和感悟。现致力于GJB5000咨询以及软件过程改进、软件工程能力提升的研究工作。

如何通过优化代码来提高程序运行效率?(续)》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:https://www.hashtobe.com/539.html