使用查表提速
一個(gè)資深的C語(yǔ)言程序員,基本上不會(huì)在自己的主循環(huán)里搞什么復(fù)雜的運(yùn)算工作,絕對(duì)都是先計(jì)算好了,再到循環(huán)里查表??聪旅娴睦樱?/p>
舊代碼:
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];
}
如果需要建立的表很大,那么可以通過(guò)一個(gè)初始化函數(shù),在循環(huán)外臨時(shí)生成表格。
看一個(gè)求余運(yùn)算
a=a%8;
如果改為:
a=a&7;
就會(huì)執(zhí)行速度變快,因?yàn)樵?a target="_blank">處理器中,位操作只需一個(gè)指令周期即可完成,而大部分的C編譯器的“%”運(yùn)算均是調(diào)用子程序來(lái)完成,代碼長(zhǎng)、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來(lái)代替。
求平方運(yùn)算
一些偏軟件的工程師往往會(huì)寫(xiě)成這樣:
a=pow(a, 2.0);
也許這樣兼容性更好,可以處理的數(shù)據(jù)類(lèi)型更多,但對(duì)于嵌入式來(lái)說(shuō),效率更為重要。
軒哥曾經(jīng)排查過(guò)一個(gè)代碼就是如此,這里的pow()函數(shù)執(zhí)行速度慢不說(shuō),調(diào)用這個(gè)函數(shù)將會(huì)產(chǎn)生2K多的代碼,直接導(dǎo)致Flash所剩無(wú)幾。
對(duì)于定點(diǎn)運(yùn)算,可以改為:
a=a*a;
在有內(nèi)置硬件乘法器的單片機(jī)中(如STM32),乘法運(yùn)算比求平方運(yùn)算快得多,因?yàn)楦↑c(diǎn)數(shù)的求平方是通過(guò)調(diào)用子程序來(lái)實(shí)現(xiàn)的,而自帶硬件乘法器的單片機(jī)中,乘法運(yùn)算只需2個(gè)時(shí)鐘周期就可以完成。即使是在沒(méi)有內(nèi)置硬件乘法器的單片機(jī)中,乘法運(yùn)算的子程序也要比平方運(yùn)算的子程序代碼短,執(zhí)行速度快。
如果是求3次方,如:
a=pow(a,3.0);
更改為:
a=a*a*a;
效率的提升會(huì)非常明顯。
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137253 -
程序
+關(guān)注
關(guān)注
117文章
3793瀏覽量
81224 -
代碼
+關(guān)注
關(guān)注
30文章
4809瀏覽量
68816
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論