由于大多数程序的大部分运行时间都用于处理各种层次的循环操作,因此,对循环左较深入的优化可大幅度的提高程序的效率。循环优化的焦点是减少循环次数和减弱循环体内语句的强度。
1.使用寄存器变量
void main(void)
{
int i,value[100];
for(i=0;i<100;i++)
{
value[i] = i;
}
}
由于循环控制变量是普通变量,因而每次循环都需访问内存,速度减慢。如果把循环控变量改为寄存器,那么每次循环不必访问内存,而直接使用CPU的内部寄存器,大大缩短了访问时间,可优化为:
void main(void)
{
register int i;
int value[100];
for(i=0;i<100;i++)
{
value[i] = i;
}
}
2.不变表达式外提
int main(void)
{
register int counter;
int values[100];
int a = 1,b=1,c=2;
for(counter=0;counter<100;counter++)
{
values[counter] = (a*b)+c+counter;
}
return 0;
}
在循环体内部表达式(a*b)+c是一个不变表达式,在每次进入循环后,都作相同的冗余计算。因此,可外提不变表达式到循环体外部,并放入一个暂存变量。优化为:
int main()
{
register int counter,t;
int a=1,b=1,c=2,values[100];
t = (a*b)+c;
for(counter=0;counter<100;counter++)
{
values[counter] = t+counter;
}
return 0;
}
3.循环强度削减
削减每次循环的强度意味着寻找循环内每一个计算,并尽可能地用运算更快的,低级的等价指令来代替它们。如下面的程序在长城286BH/12机器上,占用CPU时间为8秒钟。
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
int main(void)
{
time_t first,second;
char valus[20000];
register int counter;
int t;
char* p;
clrscr();
first = time(NULL);//Gets system timer
for(t=0;t<100;t++)
{
for(counter = 0,p=values;counter<20000;counter++)
{
*p++ = counter*8;
}
}
second = time(NULL);//Gets system time again
printf("The difference is:%f seconds\n",difftime(second,first));
getch();
return 0;
}
循环体内*p++ = counter*8是乘法运算,想办法用强度较低的加法运算代替,并尽可能减少循环体内计算。优化后的程序如下,它占用CPU的时间仅为6秒钟(在长城286BH/12机上)。
#include<time.h>
#include<stdio.h>
#include<dos.h>
#include<conio.h>
int main(void)
{
time_t first,second;
char values[20000];
register int counter,k;
int t;
char* p;
clrscr();
first = time(NULL);//Gets system time;
for(t=0;t<100;t++)//delay time
{
for(counter=0,k=0,p=values;counter<20000;counter++,p++,k+=8)
{
*p = k;//程序优化部分
}
}
second = time(NULL);//Gets systerm time again
printf("The difference is:%f secondes\n",difftimer(second,first));
getch();
return 0;
}