使用查表提速
一個資深的C語言程序員,基本上不會在自己的主循環里搞什么復雜的運算工作,絕對都是先計算好了,再到循環里查表。看下面的例子:
舊代碼:
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];
}
如果需要建立的表很大,那么可以通過一個初始化函數,在循環外臨時生成表格。
看一個求余運算
a=a%8;
如果改為:
a=a&7;
就會執行速度變快,因為在處理器中,位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調用子程序來完成,代碼長、執行速度慢。通常,只要求是求2n方的余數,均可使用位操作的方法來代替。
求平方運算
一些偏軟件的工程師往往會寫成這樣:
a=pow(a, 2.0);
也許這樣兼容性更好,可以處理的數據類型更多,但對于嵌入式來說,效率更為重要。
軒哥曾經排查過一個代碼就是如此,這里的pow()函數執行速度慢不說,調用這個函數將會產生2K多的代碼,直接導致Flash所剩無幾。
對于定點運算,可以改為:
a=a*a;
在有內置硬件乘法器的單片機中(如STM32),乘法運算比求平方運算快得多,因為浮點數的求平方是通過調用子程序來實現的,而自帶硬件乘法器的單片機中,乘法運算只需2個時鐘周期就可以完成。即使是在沒有內置硬件乘法器的單片機中,乘法運算的子程序也要比平方運算的子程序代碼短,執行速度快。
如果是求3次方,如:
a=pow(a,3.0);
更改為:
a=a*a*a;
效率的提升會非常明顯。
-
C語言
+關注
關注
180文章
7608瀏覽量
137125 -
程序
+關注
關注
117文章
3792瀏覽量
81163 -
代碼
+關注
關注
30文章
4802瀏覽量
68743
發布評論請先 登錄
相關推薦
評論