1. 常数计算的优化
一个表达式如果经常包含常数计算,则由于与数学表达式近似,易读性是很好,但是执行效率却不高.例如:
for i:=1 to 100 do
for j:=1 to 100 do
begin
tax:=a[i,j]-3200/12;
int:=irate[j]/365/12-i;
b:=tax/3*4;
end
在上面的程序中,常数表达式3200/12,365*12,4/3都要重复计算10000次,这样显然是没有必要的.于是可以改为
c1:=3200/12;
mc:=365*12;
c2:=4/3;
for i:=1 to 100 do
for j:=1 to 100 do
begin
tax:=a[i,j]-c1;
int:=irate[j]/mc –i;
b:=tax*c2;
end
这样c1,c2,mc只计算一次并保持了原来的易读性.而且这样写即清楚有提高了程序的效率
2. 算术运算的优化
计算机中各种算术运算的效率相差很大,稍加注意就可以提高程序的效率.
算术运算的速度由高到低为:加法>减法>乘法>除法>整数幂运算>实数幂运算
所以提高效率的方法是:
(1) 用加法代替乘法(仅对小整数而言)
3*I不如I+I+I
(2) 以乘法代替除法
a/0.5不如a*0.2快
(3) 对于多次除法运算使用下面的替换更有意义
a:=2.0/x;
c:=b+d/x;
e:=(F-G)/x;
改写为:
PX:=1/x;
a:=2.0*PX;
c:=b+d*PX;
e:=(F-G)*PX;
(4) 尽量少用实数幂
b3.0/2.0不如SQRT(b3)
(5) 高次整数幂应该利用降阶操作
p:=a*x^6+b*x^5-c*x^3+d*x^2+e;
不如写为:
p:=(((a*x+b)*x*x-c)*x+d)*x*x+e;
前者为16次乘法和4次加减法,后者为6次乘法和4次加减法相差很多
3. 利用非扩展循环
相比之下在循环中,判断和增值运算比一个简单的赋值语句要费时,于是可以这样进行赋值:
for i:=1 to 1000 do
begin
a[i]:=1;
a[i+1]:=1;
a[i+2]:=1;
a[i+3]:=1;
i:=i+4;
end;
这样就可以减少判断和增值运算3/4.但是这种方法也要适可而止不要写上100个赋值语句来让循环只有10次.
在多层前套循环中应将循环数值大的放在内循环中,循环数值小的放在外面,这样也可以提高程序执行效率.
还要将于循环无关的判断等操作放在循环的外面完成.
4. 对于数组的访问优化
我们知道计算机存放数组永远都是一维的,多维数组只是语言上面的约定,是为了易读易写而设置的,根据pascal的约定,数组的存放顺序是:
后继元素的下标增量从右到左的.以数组x为例,x的顺序是
x[1,1] 对应的地址是 1
x[1,2] 对应的地址是2
**** 对应的地址是 **
x[1,500] 对应的地址是500
x[2,1] 对应的地址是501
x[2,2] 对应的地址是502
**** 对应的地址是 **
x[20,500] 对应的地址是10000
如果我们存数组的顺序是按照x[1,1],x[2,1],x[3,1]…..的顺序的时候,所访问的地址为1,501,1001…...但是数据在机器里面存放是按照2KB为一个分页的,因此当寻址加上标值的位移量时还要查页码,反复查页码会耗费时间,所以当元素较多的时候应尽可能的按照顺序安排计算.