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 中讀取數據。