C语言编程常见错误-循环优化1

 由于大多数程序的大部分运行时间都用于处理各种层次的循环操作,因此,对循环左较深入的优化可大幅度的提高程序的效率。循环优化的焦点是减少循环次数和减弱循环体内语句的强度。

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值