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