其他
手把手教你嵌入式C语言优化技巧
此外,我们还要避免不必要的函数调用,请看下面的代码:
[plain] view plain copy print?
void str_print( char *str )
{
int i;
for ( i = 0; i < strlen ( str ); i++ )
{
printf("%c",str[ i ] );
}
}
void str_print1 ( char *str )
{
int len;
len = strlen ( str );
for ( i = 0; i < len; i++ )
{
printf("%c",str[ i ] );
}
}
(1) 在多重循环中,应将最长的循环放在最内层,最短的循环放在最外层。这样可以减少 CPU跨切循环的次数。如例 1-1 的效率比 1-2 的效率要低:
[plain] view plain copy print?
for (j = 0; j < 30; j++)
{
for (i = 0; i < 10; i++)
{……}
} // 例子 1-1
for (i = 0; i < 10; i++)
{
for (j = 0; j < 30; j++)
{……}
} // 例子 2-2 程序部简洁但效率高
[plain] view plain copy print?
switch (表达式)
{
case 值1:
语句1: break;
case 值2:
语句2:break;
……
/*把发生频率低的放在内层的switch语句中*/
default:
switch (表达式)
{
case 值n:
语句n: break;
case 值m:
语句m: break;
……
}
}
例子3 使用嵌套switch语句提高程序执行效率。
while (1);
编译后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前:
for (;;);
编译后:
jmp foo+23h
显然,for (;;)指令少,不占用寄存器,而且没有判断,跳转,比while (1)好。
[plain] view plain copy print?
int fib ( n )
{
if ( n == 0 || n == 1 )
{
return 1;
}
else
{
return fib( n - 2 ) + fib ( n - 1 );
}
}
[plain] view plain copy print?
int calc_fib ( int n )
{
int val[ n ] , i;
for ( i = 0; i <=n; i++ )
{
val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1
}
val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1
val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1
return fib( n , val );
}
int fib( int n , int* value )
{
if ( value[ n ] != -1 )
{
return value[ n ]; // Using memoization
}
else
{
value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term
}
return value[ n ]; // Returning the value
}
-END-
推荐阅读
【01】“不敢精通”的C++的高级工程师要学会什么?【02】重磅干货||五万字长文总结:C/C++ 知识(上)【03】重磅干货||五万字长文总结:C/C++ 知识(下)【04】C++ 如何避免内存泄露【05】C/C++应用:深入理解Socket网络通信