高效率C语言编程的几个方法
1.时间与空间问题
在嵌入式领域,我们经常会遇到时间和空间上的问题, 有的是实时性要求比较高的那么就需要利用空间来换取时间,
方法A:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,“This is a example!!”);
方法B:
const char string2[LEN] =“This is a example!”;
char * cp;
cp = string2 ;
虽然这种方法必要笨拙,缺乏灵活性,但在特殊的情况下效率是比较高的.
2.宏的问题
一般情况下,不建议使用宏,因为宏破坏了程序的可读性,特别是代码中潜入很多宏的时候排错就很麻烦! 但是如果在特殊的情况下,比如追求效率的情况下还是可以使用一下, 在一般情况下我们还是将这个工作交给编译起来完成, 因为现代的编译器会自动的把小函数或内联函数扩展为宏.(我一般只用宏来进行定义常数, 条件编译工作).
3.采用数学的方法来优化程序
有时候这个问题常常被大家忽略, 对于没有没有经验的程序员来说更是如此, 然而这个对效率的差别是巨大的,一个经典的例子就是:
求 1~100的和。
方法A:
int I , j;
for (I = 1 ;I<=100; I ++)
{
j += I;
}
方法B:
int I;
I = (100 * (1+100)) / 2
很显然这里的差别也是巨大的, 方法B的代码也更简洁, 呵呵^_^,所以程序员数学不好那也是限制发展的一个因素!
4.使用位操作来代替乘法和除法
大家都知道乘法和除法在cpu中是不能直接进行的, cpu采用加法来现, 所以在适当的情况下我们要使用位移来实现乘法和除法.如
a=211/4; 也可以写成a=211>>2;(这里的适当时候,当然是运算式不是很复杂的时候, 如果需要都用位移来操作,那么调程序的时候会痛苦死的^_^)!
5.汇编潜入
大家都知道在计算机里,汇编是跑的最快的程序语言, 使用汇编可以时程序的效率提高一定的数量级, 但是所谓事物的两面性, 使用汇编也减低的程序的可移植性, 而且很可能对程序造成巨大的破坏.建议是高手使用,而且也仅仅限与底层处理或性能要求非常苛刻的时候.如:
char string1[1024],string2[1024];
方法I
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
注:这里的例子代码都载之www.vckbase.com网站!
在嵌入式领域,我们经常会遇到时间和空间上的问题, 有的是实时性要求比较高的那么就需要利用空间来换取时间,
方法A:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,“This is a example!!”);
方法B:
const char string2[LEN] =“This is a example!”;
char * cp;
cp = string2 ;
虽然这种方法必要笨拙,缺乏灵活性,但在特殊的情况下效率是比较高的.
2.宏的问题
一般情况下,不建议使用宏,因为宏破坏了程序的可读性,特别是代码中潜入很多宏的时候排错就很麻烦! 但是如果在特殊的情况下,比如追求效率的情况下还是可以使用一下, 在一般情况下我们还是将这个工作交给编译起来完成, 因为现代的编译器会自动的把小函数或内联函数扩展为宏.(我一般只用宏来进行定义常数, 条件编译工作).
3.采用数学的方法来优化程序
有时候这个问题常常被大家忽略, 对于没有没有经验的程序员来说更是如此, 然而这个对效率的差别是巨大的,一个经典的例子就是:
求 1~100的和。
方法A:
int I , j;
for (I = 1 ;I<=100; I ++)
{
j += I;
}
方法B:
int I;
I = (100 * (1+100)) / 2
很显然这里的差别也是巨大的, 方法B的代码也更简洁, 呵呵^_^,所以程序员数学不好那也是限制发展的一个因素!
4.使用位操作来代替乘法和除法
大家都知道乘法和除法在cpu中是不能直接进行的, cpu采用加法来现, 所以在适当的情况下我们要使用位移来实现乘法和除法.如
a=211/4; 也可以写成a=211>>2;(这里的适当时候,当然是运算式不是很复杂的时候, 如果需要都用位移来操作,那么调程序的时候会痛苦死的^_^)!
5.汇编潜入
大家都知道在计算机里,汇编是跑的最快的程序语言, 使用汇编可以时程序的效率提高一定的数量级, 但是所谓事物的两面性, 使用汇编也减低的程序的可移植性, 而且很可能对程序造成巨大的破坏.建议是高手使用,而且也仅仅限与底层处理或性能要求非常苛刻的时候.如:
char string1[1024],string2[1024];
方法I
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
注:这里的例子代码都载之www.vckbase.com网站!
将想法付诸于实践,借此来影响他人是一个人存在的真正价值