拆解循環-以空間換時間
在編寫循環處理程序的時候要充分利用CPU的指令緩存,要充分分解小的循環。特別是當循環體本身很小的時候,分解循環可以提高性能。
這里要注意,很多編譯器并不能自動分解循環。不好的代碼:
// 3D轉化:把矢量 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
充分提取循環中的公共部分
對于一些不需要循環變量參加運算的任務可以把它們放到循環外面,這里的任務包括表達式、函數的調用、指針運算、數組訪問等,應該將沒有必要執行多次的操作全部集合在一起,放到一個init的初始化程序中進行。
03
延時函數中的循環技巧
通常使用的延時函數均采用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i< 1000;i++) ;
}
將其改為自減延時函數:
void delay (void)
{
unsigned int i;
for (i=1000;i >0;i--) ;
}
兩個函數的延時效果相似,但幾乎所有的C編譯對后一種函數生成的代碼均比前一種代碼少13個字節,因為幾乎所有的MCU均有為0轉移的指令,采用后一種方式能夠生成這類指令。在使用while循環時也一樣,使用自減指令控制循環會比使用自加指令控制循環生成的代碼更少13個字母。
但是,在循環中有通過循環變量“i”讀寫數組的指令時,使用預減循環有可能使數組超界,要引起注意。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7598瀏覽量
136207 -
程序
+關注
關注
116文章
3777瀏覽量
80853 -
編譯器
+關注
關注
1文章
1618瀏覽量
49052
發布評論請先 登錄
相關推薦
C語言中for循環的用法和應用 C語言中for循環與while循環的區別
C語言中的循環結構時,for循環是最常用的一種。它允許重復執行一段代碼,直到滿足特定條件為止。
發表于 08-18 16:33
?3143次閱讀
C語言入門教程-if語句和while循環
if語句和while循環
C語言中,if語句和while循環都會用到布爾表達式。下面是一個使用if語句的簡單例子:
#include
發表于 07-29 10:48
?8527次閱讀
c語言在while中嵌套if循環
C語言是一種廣泛使用的面向過程編程語言,它提供了許多控制結構來幫助程序員實現復雜的邏輯和流程控制。其中,while循環和if語句是非常常見和重要的控制結構。本文將詳細介紹
評論