C语言常规优化策略
从理论上讲,程序的优化一般分为局部优化、循环优化和全局优化三个层次。所谓局部优化,重点在于删除程序中的无用赋值,利用语言的特性对基本赋值语句优化,局部优化一般不宜过多采用,但如果程序中总是有一些无效赋值或没有引用的变量,这可能给别人造成幼稚的印象;循环优化和全局优化往往能大幅提升程序效率,因此有关的技术对于高质量的程序设计是至关重要的。
本文讨论C语言程序常规优化策略,其重点在于局部优化和循环优化,包括赋值语句优化、条件语句优化、各类循环优化策略、参数传递、全局变量及宏的使用等内容,其中避免乘、除运算及浮点运算的方法是非常巧妙的。这些方法均为程序员广泛熟知并采用,这里,仅仅将它们收集在一起以备大家参考。
当然,各种优化策略的使用应具备时机,并遵循程序开发的基本准则。例如,对于循环优化,很多成熟的编译器均有十分全面的处理,非特别影响效率的代码段,一般不必考虑,而全局变量的采用往往会带来很多不良的副作用,一般也不宜采用。
1、赋值语句优化
1.1 避免无用赋值
在代码中,若一个变量经赋值后在后面语句的执行过程中不再引用,则这一赋值语句就称为无用赋值。且看下面杜撰的代码段
int DoSmth(int x)
{
int y, z;
if (x>=0)
x=x;
else
x=-x;
y=3;
z=f(x);
return z;
}
其中y=3为无用赋值语句,可以删除,而x=x语句是为了填补条件语句中条件成功分支的空缺,同样是无用的赋值。在这种情况下,可以直接删除该语句,只保留一个分号作为空语句标识,如果为醒目起见,则可用null来代替。下面给出修改后的代码段
int DoSmth(int x)
{
int z;
if (x>=0)
null;
else
x=-x;
z=f(x);
return z;
}
当然程序可以采用更佳的结构以驱除null语句:
int DoSmth(int x)
{
if (x<0)
x=-x;
return f(x);
}
但有时代码中为了保持逻辑上的完整性,或者出于理解代码的原因,有时会出现空语句,建议采用null的写法以警醒自己或其它人。
在C程序中,无效的变量声明应当从程序中删除,当出现无效的变量声明时,编译器一般会用“没有引用的变量”来警告你。
~~~~~~~~~~~~~~
1.2 合并已知量
我们要计算两点之间的距离,相应的点结构及代码的如下:
typedef struct tagPoint
{
double x,y;
} Point;
double Dist(Point P1, Point P2)
{
return sqrt((P1.x-P2.x)* (P1.x-P2.x)+(P1.y-P2.y) (P1.y-P2.y));
}
代码中, P1.x-P2.x,P1.y-P2.y均计算两次,如果我们将一次计算的结果保留下来,就可以减少相应的操作次数
double Dist(Point P1, Point P2)
{
double xDelta= P1.x-P2.x;
double yDelta= P1.y-P2.y;
return sqrt(xDelta*xDelta+yDelta*yDelta);
}
程序设计中还存在一种现象,为了方便,我们通常定义一系列常量,在代码中会反复引用这些常量,例如下面的代码中定义了一个圆周率常量,并在圆周长的计算中出现对它的引用
#define PI 3