一、空间换时间
例如:字符串的赋值方法A:
#define LEN 32char stringl[LEN];MEMSet(stringl,0,LEN);strcpy(stringl,“This is anexample!!”);方法B:
const char string2[LEN]=“thisis an example!!”;char *cp;cp=string2;从上面的例子可以看出,方法A和方法B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A要调用两个字符函数才能完成。B的缺点在于灵活性没有A好,在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
二、运用数学方法
在编写程序时,采用一些数学方法会大大提高程序的执行效率。
例如:求1~100的和。
方法A:
int I,j;for(I=l;I<=100;I++){j+=I;}
方法B:
int I:
I=(100*(1+100))/2;方法A循环了100次,最少用了100个赋值,100次判断,200个加法(I和j);方法B仅仅用了1次加法,1次乘法和1次除法。
三、多使用位操作
在计算机程序中,位是可以操作的最小数据单位,从理论上讲可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件或者做数据交换使用,但是灵活的位操作也可以有效地提高程序运行的效率。举例如下:
方法A:
int I,j;I=257/8;j=456%32;
方法B:
int I,j;I=257》3;j=456-(456》4《4);从程序上看好像方法B比方法A麻烦。但是,仔细查看产生的汇编代码就会明白,方法A调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法B则仅仅是几句相关的汇编,代码更简洁,效率更高。
四、嵌入汇编
举例如下:将数组1赋值给数组2,要求每一字节都相符。
char stringl[1024],string2[1024];方法A:
int I;for(I=0;I<1024;I++)*(string2+I)=*(stringl+I);方法B:
#ifdef_PC_int I:
for(I=0;I<1024;1++)*(string2+I)=*(slringl+I);#else#ifdef_ARM__asm{ mov R0,stringlmov R1.string2mov R2,#OLOOP:
LDMIA RO!,[R3-R11]
STMIA R1![R3-R11]
ADD R2,R2,#8CMP R2,#400BNE LOOP}
#endif方法A是最常见的,使用了1024次循环;方法B则根据平台做了区分,在ARM平台下,用嵌入汇编仅128次循环就完成了同样的操作。有人会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为O的字节,这样,标准库函数会提前结束而不能完成要求的操作。这个例程的典型应用是LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。