esp32 c5芯片模组乐鑫蓝牙音箱方案代理商C语言循环处理查找表替换,精心处理循环,增加循环体内连续顺序执行的指令数量,减少循环次数,从而可减少循环过程中所执行的总指令数,提高程序执行的速度。
(1) 循环展开
示例 8.8 中,将(a)中循环展开为(b)中的形式,循环体内由 1条语句变为4条语句,(b)中循环次数变为(a)的 1/4。
每次循环,处理器都执行循环体内的语句和循环控制语句。循环(b)与(a)相比循环体内语句总的执行次数不变,但循环体执行的次数变为 1/4,循环控制指令数变为(a)的 1/4,esp32 c5芯片模组乐鑫蓝牙音箱方案代理商处理器执行的总指令数变少,执行时间变短。
另外,(b)循环体内连续执行的指令数是(a)的 4 倍,因循环而导致的跳转次数是(a)的 1/4。对于支持指令流水线的处理器,(b)循环运行过程中流水线被打断的次数是(a)的 1/4,esp32 c5芯片模组乐鑫蓝牙音箱方案代理商能够更好地利用流水线提高程序运行速度。
示例8.8:循环展开
(a)
int checksum( int * data,
unsigned int N)
{
int sum = 0;
Do{
sum += * (data ++ );
N-- ;
}while(N!= 0);
return sum;
}
-----------------------------------------------
(b)
int checksum( int *data,unsigned int N)
{
int sum = 0;
do{
sum += * (data ++ );
sum += * (data ++ );
sum += * (data++ );
sum += *(data ++ );
N-=4;
} while(N!=0);
(2) 避免循环体内重复操作
示例 8.9 中,(b)将(a)中循环体内计算的“a+4”移到循环体外,esp32 c5芯片模组乐鑫蓝牙音箱方案代理商在内循环外声明临时弯量b=a+4,替代内循环体内计算,去除内循环中的重复计算,减少程序指令数量。
示例8.9:减少重复计算。
(a)
int checksum( int a)
{
.......
for(i=0;i<64;i++)
{
sum[i] = a + 4;
}
......
}
----------------------------------------------------------
(b)
int checksum(int a)
{
......
register int b = a + 4;
for(i= 0;i<64;i++)
{
sum[i] = b;
}
......
}
查找表替换
在C语言程序中,通常利用函数实现三角计算、对数计算等复杂度较高的运算。如果程序中有大量此类运算。则将带来巨大的计算负担。采用查找表替换复杂的函数计算,将会减轻计算负担,提高程序运行速度。
使用查找表替换函数计算前,需要计算出程序中所使用的所有可能的函数值,并存入数组中。esp32 c5芯片模组乐鑫蓝牙音箱方案代理商在程序中,以函数的输入参数为索引,从数组中查找函数值,不需要计算。
例如,在示例 8.10 中,将(a)程序改成查找表形式的(b)。其中,用下式计算函数数组中的值。
Asin[i]=sin(i*p²/M) (8.1)
(a)
for(int j=0;j<N;j++)
for (inti= 0;i M;i++)
*ptemp=j*sin(i*pi/M);
----------------------------------------------------------
(b)
for(intj=0;j N;j++)
for (int i = 0;i M; if+)
* ptemp = j* Asin[i];
在嵌入式系统中,通常将查找表保存在 ROM 中,程序运行时直接从 ROM 中读取数据。