2015年6月27日 星期六

程式壓縮技巧 1 ─ 常數、變數排列重整

http://4rdp.blogspot.com/2015/06/1.html?m=0

從本週起,有空將陸陸續續發表一些程式壓縮技巧,通常 PC 上執行的程式比較沒有大小限制的問題,不過這對單晶片程式設計很重要,尤其是低價或是簡易功能的商品,多是選用小型 MCU,ROM size <= 64 kB,以前曾設計過 4 kB 微波爐控制器還含有食譜的火力表,因此寸土寸金的程式空間要擠下那麼多功能,再再考驗程式設計師的智慧與功力。

言歸正傳,程式壓縮技巧百百種,只要掌握基本原則,編譯後程式碼自然縮減許多,本文先點出一個簡單但很容易忽略的方法,那就是把常數、變數位址重新整理調整

Arduino 例子如下:

修改前,程式使用 3378 bytes

enum {
    ONE = 1,
    TWO,
    THREE
};

char num;
String ID;

void setup()
{
    Serial.begin(9600);

    num = ONE;
    ID = "A0";
    ID[1] = '0' + num;
    Serial.println(ID);          // print   A1
} void loop() { }

=============================================
修改後,程式使用 3376 bytes

enum {
    ONE,     // = 0
    TWO,
    THREE
};

char num;
String ID;

void setup()
{
    Serial.begin(9600);

    num = ONE;
    ID = "A0";
    ID[1] = '1' + num;
    Serial.println(ID);          // print   A1
}
void loop() { }

這個例子讓讀者了解,電腦系統計數是以零為起始,配合習慣程式碼比較小,這雖然只壓出一點點空間,不過在危急時聚沙成塔,能救命的手段都是有用的。

沒有留言:

張貼留言