之前剛開始工作時(shí),參與做過嵌入式代碼優(yōu)化,除了最基本的函數(shù)實(shí)現(xiàn)細(xì)節(jié)算法優(yōu)化外,還有一些細(xì)節(jié)的處理。當(dāng)然之前優(yōu)化時(shí),也是借助了分析工具來分析哪些函數(shù)調(diào)用頻繁,哪些開銷比較大。對(duì)于具體細(xì)節(jié)的處理記得不一定全面了,當(dāng)然也有部分操作在編譯時(shí),工具也有可能自動(dòng)進(jìn)行優(yōu)化。
函數(shù)展開
類似inline,減少函數(shù)出棧入棧開銷
結(jié)構(gòu)體比較
相應(yīng)數(shù)據(jù)結(jié)構(gòu)具有不同的比特位含義,而高位更具有意義,比較時(shí)無需將成員一一比較,強(qiáng)轉(zhuǎn)32/64位格式比較。
相同操作提取
提取相同深度的指針指向,如下A、C、D為指針,E為具體成員操作。
A->C->D->E1,A->C->D->E2,A->C->D->E3... ...則可將A1 = A->C->D,然后使用A1->E1、A1->E2、A1->E3進(jìn)行替換操作。
消息合并
線程之前多個(gè)消息發(fā)送會(huì)導(dǎo)致開銷變大,可以合并成單個(gè)消息,同時(shí)處理多個(gè)事情,當(dāng)然前提是這些事件可進(jìn)行合并。
時(shí)間空間的轉(zhuǎn)換(動(dòng)態(tài)申請(qǐng)用靜態(tài)變量替代)
頻繁使用的消息可以改為一次性申請(qǐng)或是靜態(tài)方式,以減少頻繁申請(qǐng)釋放的開銷;而同一邏輯部分可能申請(qǐng)多次的情況,可以采用半靜態(tài)半動(dòng)態(tài)的方式,可以通過統(tǒng)計(jì)經(jīng)常同時(shí)使用的次數(shù)來確定靜態(tài)內(nèi)存的大小。
寄存器(變量定義)問題
在arm上匯編可以看到當(dāng)定義uint8 i;for(i = 1; i< 255; i++)時(shí)寄存器為32bit,所以在處理8bit數(shù)據(jù)時(shí),需要額外的移位等操作來放置溢出超過8位情況,此時(shí)使用uint32定義反而可以減少M(fèi)IPS開銷。