close

紀錄一些寫code的時候最佳化的技巧 (主要是由Cortex-A Series Programmer's Guide看來的)
著重於souce code optimization方面,而不是演算法方面
當然有一個好的演算法能夠大大增加效能
因此在討論optimization方面
演算法是首先考慮的問題
再去追求code方面的optimization

1. Function inlining
call function會有overhead, 例如
必須把回傳值存起來、push 暫存器到stack、把參數存到暫存器...
所以如果這個function做的事情很少 (可能只有幾個指令)
但是又被呼叫很多次,就會造成效能無謂的浪費
function inlining 的作法就是複製一份function的原始碼到
程式裡面用到這個function的地方,取代掉function call的方式 (push stack)
(一般來說,把function宣告成inline,然後compiler會做複製的動作)
這樣最後呈現的組語就不會有call function這一段描述
但是缺點就是,因為他是複製一份function裡的source code,
所以會增加code size

那最好在那裡用inline functions呢?
a. 如果這個function只在一個地方被用到
b. 呼叫這個function的指令比真正function內執行的指令還多


哪裡不適合用?
a. functions that are intended to be patched
b. common library functions that are separate from the main codebase

-----
這兩點至於是為什麼? 我也不清楚 Orz
之後如果有解 在跟大家分享 或是有強者可以為大家解惑~

2. Eliminating common sub-expressions
盡量重複使用已經計算好的結果
例如


i = a + b + c;
j = a + b + d;


compiler 出來的code


t = a + b;
i = t + c;
j = t + d;



3. Loop unrolling
每跑一個迴圈,就必須檢查終止條件,會造成branch instruction的產生
會多花幾個cycle


CMP i, #5
BLT for_loop


unrolling the loop


x[0] = 0;
x[1] = 1;
x[2] = 2;
x[3] = 3;
x[4] = 4;


4. GCC optimization options
a. -O0: 預設值,沒有任何的最佳化
b. -O1: compiler的速度比-O0快
c. -O2: 多做instruction scheduling
d. -O3: 多做function inlining
e. -funroll-loops: 做loop unrolling (會增加code size,而且有可能效果不好)
f. -Os: 最小化image size

參考資料

Cortex-A Series Programmer's Guide

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 jpsix 的頭像
    jpsix

    地瓜粥在讀書

    jpsix 發表在 痞客邦 留言(0) 人氣()