一个好的控制结构对程序执行的影响是巨大的,因此,对控制结构优化非常重要。
今天我们来谈谈优化结构控制:
一 表达式优化———使用替换程序中的乘除法
表达式优化是最基本的优化,使用简洁高效的表达式可以大幅度的提高程序的效率。优化是一个广泛而深入的话题,在程序执行过程中,加减法是计算机最喜欢的操作。其执行时间只占用1个时钟周期,是最快速的操作。位运算与移位计算执行速度与减法相近,乘法时间要长,大概在5~6个周期完成。不用说都知道除法最慢,大约需要50个时钟周期。因此,我们需要用一些操作代替乘除法。
1.移位操作代替乘法:
这显然可以提高程序的运行效率。
举例说明:
#include <stdio.h>
int main()
{
int a=16;
printf("a divided by 4:%d\n",a>>2);
printf("a multiplied by 5:%d\n",(a<<2)+a);
return 0;
}
输入结果:
a divided by 4:4
a multiplied by 5:80
移位操作是一个很好的选择,数据左移移位相当于乘以2,右移移位相当于除以2。
a multiplied by 5:80
移位操作是一个很好的选择,数据左移移位相当于乘以2,右移移位相当于除以2。
总结:所有乘法操作都可以用左移运算来替换,例如:a*8可以替换为a<<3,而a*13可以替换为(a<<3)+(a<<2)+a,但是除法操作不可以。只有除法操作的除数正好是一个2的n次幂才能用右移操作来替换除法,例如:a/8可以替换成a>>3,但是a/13却无能为力了。
二 结构优化——常量折叠
在进行计算中,通常要进行连续的四则运算,例如:
int a=10;
a=a+2*17+6;
这个程序实际上相当于
int a;
a=a+40;
如果写成第二种形式,程序只用执行一次。
如果写成第一种,程序要进行1次乘法2次加法。
谁速度快就一目了然了。这种将程序中的常量人为的计算的方法叫做常量折叠。
对于现代的编译器来说,常量折叠已经是一种常规的常量折叠方式。也就是说,即使研发人员没有使用常量折叠,编译器会自己执行。当然有些情况不使用会更好,便于理解与维护。