Linux程序設計的一些優化措施
這些知識是在平常的閱讀中,零散的獲得的,自己總結了一下,分享在這里
全局變量VS函數參數
全局變量在Linux下的驅動編程里邊,用的是非常多,例如中斷服務函數ISR,基本上都可以用全局變量來作為數據的更新,及事件的觸發。給函數傳遞參數的效率一般來說,要低于直接使用全局變量,尤其是參數的數目太多的時候。參數傳遞,是需要先將參數push到stack中,等程序運行完畢,再從stack中pull出來,過程上要比global variable復雜。但是,全局變量過多的話,這里邊就設計到管理的問題了,到后面就很難去控制這些變量的修改,這對于函數的模塊化有不利的影響。
- i=i+1;
- i++;
- i--;
這三個語句都通常引用在for()或者是while()里邊,從執行效率上來說 3》2》1
這和最終生成的匯編語言有關,一般來說,影響不會太夸張。
switch-case語句
switch-case語句,也是用的非常多的語句。
這里首先的優化原則就是:將發生概率***的條件,放在***判斷的位置。這樣就能夠有效的降低比較的次數,達到更優的效果。或者,有一種更好的方法來替代switch-case語句的方法,就是利用查表
比如
- switch(msg_type)
- {
- case DATA:
- handle_data_fun();
- break;
- case RTS:
- handle_rts_fun();
- break;
- .......
- }
這里就可以用函數指針和查表的方式,獲得handle_fun的方法來替代。
處理函數都在初始化的過程中,放到*handle_fun[MAX]相應的位置上
- int (*handle_fun[MAX])(struct msg_t *msg);
- int msg_type = msg->type;
- handle_fun[msg_type](msg);//即可
這種方法,在Linux的網絡協議里邊,用的非常多,一般對應的查表方式為hash表結構。
sturct 和 union的使用
sturcut 使用,一定要考慮到字節對其的問題,struct中,不同的安排順序,sizeof是不同的所以要調整好位置,盡量保證struct的size最小。
union的使用,比如對不同包的數據結構上,是不一樣的,所以盡量使用union來區分不同的包結構這樣對程序的可讀性比較好。
volatile的使用
這在驅動編程方面是非常有用的一個標志。目的是不讓編譯器compiler把當前的變量優化掉。尤其是涉及到硬件寄存器的值的時候。
乘除運算的簡化
乘除運算,對arm來說太致命,arm的乘除都生成一堆的匯編指令才能完成。所以一般可以通過位操作,比如移位,取低位來進行適當的化簡。比如 a*8 = a<<3;
Inline 函數
在實現比較簡單功能的函數,以及那些調用非常平凡的函數,都可以在函數前加入inline的標識。這樣在產生匯編的時候,能夠更有效。也可以替代較復雜的define語句。