拆解循環(huán)-以空間換時(shí)間
在編寫循環(huán)處理程序的時(shí)候要充分利用CPU的指令緩存,要充分分解小的循環(huán)。特別是當(dāng)循環(huán)體本身很小的時(shí)候,分解循環(huán)可以提高性能。
這里要注意,很多編譯器并不能自動(dòng)分解循環(huán)。不好的代碼:
// 3D轉(zhuǎn)化:把矢量 V 和 4x4 矩陣 M 相乘
for (i = 0;i < 4;i ++)
{
r[i] = 0;
for (j = 0;j < 4;j ++)
{
r[i] += M[j][i]*V[j];
}
}
推薦的代碼:
r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3];
r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3];
r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3];
r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3];
02
充分提取循環(huán)中的公共部分
對(duì)于一些不需要循環(huán)變量參加運(yùn)算的任務(wù)可以把它們放到循環(huán)外面,這里的任務(wù)包括表達(dá)式、函數(shù)的調(diào)用、指針運(yùn)算、數(shù)組訪問等,應(yīng)該將沒有必要執(zhí)行多次的操作全部集合在一起,放到一個(gè)init的初始化程序中進(jìn)行。
03
延時(shí)函數(shù)中的循環(huán)技巧
通常使用的延時(shí)函數(shù)均采用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i< 1000;i++) ;
}
將其改為自減延時(shí)函數(shù):
void delay (void)
{
unsigned int i;
for (i=1000;i >0;i--) ;
}
兩個(gè)函數(shù)的延時(shí)效果相似,但幾乎所有的C編譯對(duì)后一種函數(shù)生成的代碼均比前一種代碼少13個(gè)字節(jié),因?yàn)閹缀跛械?a target="_blank">MCU均有為0轉(zhuǎn)移的指令,采用后一種方式能夠生成這類指令。在使用while循環(huán)時(shí)也一樣,使用自減指令控制循環(huán)會(huì)比使用自加指令控制循環(huán)生成的代碼更少13個(gè)字母。
但是,在循環(huán)中有通過循環(huán)變量“i”讀寫數(shù)組的指令時(shí),使用預(yù)減循環(huán)有可能使數(shù)組超界,要引起注意。
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136861 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81057 -
編譯器
+關(guān)注
關(guān)注
1文章
1634瀏覽量
49134
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論