使用查表提速
一個資深的C語言程序員,基本上不會在自己的主循環(huán)里搞什么復(fù)雜的運算工作,絕對都是先計算好了,再到循環(huán)里查表。看下面的例子:
舊代碼:
long factorial(int i)
{
if (i == 0)
return 1;
else
return i * factorial(i - 1);
}
查表法新代碼:
static long factorial_table[] = {1, 1, 2, 6, 24, 120, 720 /* etc */ };
long factorial(int i)
{
return factorial_table[i];
}
如果需要建立的表很大,那么可以通過一個初始化函數(shù),在循環(huán)外臨時生成表格。
看一個求余運算
a=a%8;
如果改為:
a=a&7;
就會執(zhí)行速度變快,因為在處理器中,位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調(diào)用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來代替。
求平方運算
一些偏軟件的工程師往往會寫成這樣:
a=pow(a, 2.0);
也許這樣兼容性更好,可以處理的數(shù)據(jù)類型更多,但對于嵌入式來說,效率更為重要。
軒哥曾經(jīng)排查過一個代碼就是如此,這里的pow()函數(shù)執(zhí)行速度慢不說,調(diào)用這個函數(shù)將會產(chǎn)生2K多的代碼,直接導(dǎo)致Flash所剩無幾。
對于定點運算,可以改為:
a=a*a;
在有內(nèi)置硬件乘法器的單片機中(如STM32),乘法運算比求平方運算快得多,因為浮點數(shù)的求平方是通過調(diào)用子程序來實現(xiàn)的,而自帶硬件乘法器的單片機中,乘法運算只需2個時鐘周期就可以完成。即使是在沒有內(nèi)置硬件乘法器的單片機中,乘法運算的子程序也要比平方運算的子程序代碼短,執(zhí)行速度快。
如果是求3次方,如:
a=pow(a,3.0);
更改為:
a=a*a*a;
效率的提升會非常明顯。
-
C語言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134130 -
程序
+關(guān)注
關(guān)注
115文章
3720瀏覽量
80359 -
代碼
+關(guān)注
關(guān)注
30文章
4671瀏覽量
67770
發(fā)布評論請先 登錄
相關(guān)推薦
評論