电竞比分网-中国电竞赛事及体育赛事平台

分享

如何優(yōu)化代碼

 guitarhua 2013-04-21

如何優(yōu)化代碼

編程 2010-05-25 23:10:09 閱讀99 評論1   字號: 訂閱

縮小編譯代碼 size 的幾種方式:

(A)    邏輯與算法:

合理的工作邏輯與算法. 一般而言, Code 永遠是工程師的邏輯思維的體現(xiàn). 無論是實現(xiàn) function target or 構(gòu)建 system struction, 邏輯思維的能力高低, 對 code size 具有深度影響(甚至對整個 project 的成功實現(xiàn), 具有決定性的影響).

 

(B) 編譯器的配置:

1. 將編譯器的 size 優(yōu)化調(diào)整到 high級別.

2.   如果我們是 arm 的 user, 應(yīng)選擇 Thumb mode, 而不是 Arm mode.

我們無意在這里討論16-bit thumb指令集 與 32-bit arm 指令集有何具體異同. 我們僅僅從 mcu 的datasheet 中尋找到如下解釋(討論了兩者最終表現(xiàn)力): “工作在與 arm mode 相同的 32-bit 寄存器上, thumb code 保持了絕大部分的 arm 的表現(xiàn)力(的同時), Thumb code能夠提供高達 65% 的(作為比較的)arm code size.”

 

(C) 謹(jǐn)慎使用任何標(biāo)準(zhǔn)/編譯器提供的 C Library function:

謹(jǐn)慎使用編譯器提供的任何C Library function, 如果必需, 盡量自行完成需要的函數(shù)功能.

1. 謹(jǐn)慎使用string相關(guān)函數(shù)

無論是 sprintf(), atoi(), ntop(),都會帶來size 的顯著增加. 如有可能, 我們應(yīng)當(dāng)自行完成我們需要的類似的 functions.

 

2. 謹(jǐn)慎使用 time 相關(guān)函數(shù): 舉例說 localtime(), etc 等函數(shù).

 

3.   謹(jǐn)慎使用 math 函數(shù), 盡量不要包含 math.h
作為兩個比較的的例子是, 在同等編譯條件下, fasbs()可能多耗費 about 200bytes. sqrt() 可能會多耗費 about 3.5k bytes.

 

(D) 數(shù)據(jù)類型與編程習(xí)慣

1.       盡量避免 char(U8/S8), short(U16/S16) 的定義, 而使用 int(U32/S32) 的定義.

對于從 8-bit來到 arm world 的 engineer, 可能份外不習(xí)慣這個轉(zhuǎn)變吧?

C/C++ compiler reference document 明確指出: 只要可能, 就應(yīng)使用 int or long 來替代 char or short, 從而避免了符號位擴展與zero拓展. 而且, 對 loop index 使用 int/long 將減小 code 產(chǎn)生. 特別要指出, 在 thumb mode, stack pointer(SP) 被嚴(yán)格定義為 32-bit data types(因此更應(yīng)該使用 int/long).

       一個令人有興趣的簡單實驗?zāi)軌蜃C明, 所謂的”sign extension or zero extensize”帶來的額外代碼消耗. 在一份c的源文件中, 如果我們定義了 U8 global_data. 簡單將其改為 U32 global_data. Then do rebuild all, we will find the code size decrease 4 bytes… ; ) 但是要提及的是, 我們的項目經(jīng)驗說明這個way往往還會帶來一個其他的效果: DATA size在這種情形下或略有增加.

 

2.       盡量避免使用帶符號位的數(shù)據(jù)類型.

 

3.       盡量避免 long(8-byte) 的定義.

 

4.       Bitfields 與 packed structures 將產(chǎn)生大而且慢的代碼.

對于 packed structures, 作者在相同的 blog 主頁發(fā)表了專題文章, 指出了選擇使用 packed structures, 仍然可以享受到盡可能小的 code size, 以及保持access speed的處理方式. 檢索作者的 blog, 或檢查全部文章列表, 將會發(fā)現(xiàn)該篇文章. 在我們的項目經(jīng)驗中, 在 32k bytes 左右的 project 中, 我們獲得了額外的大約 2k bytes 的節(jié)省的 code size.

 

5.       盡量不要定義 float, double.

在一些運算中, 我們常常將牽涉到如下步驟: 將float *10e(小數(shù)點后位數(shù)), 將float轉(zhuǎn)化為U32進行運算. 結(jié)果在/10e(相應(yīng)位數(shù)). 運算精度在這里被降低了. 但這完全取決于我們的工作目標(biāo): 在不復(fù)雜的算法中, 避免了浮點運算的使用(以上討論, 均假設(shè)我們的 mcu 不包含浮點運算協(xié)處理器). Reference 也一再強調(diào)沒有math協(xié)處理器, 浮點數(shù)據(jù)類型效率低下.

 

6.       reference 指出, 盡量定義 local 變量. 減少 static 或 global 變量的定義, 這樣將幫助優(yōu)化的過程. 且local 變量盡量少使用 &. Reference 指出, 這種定義將放置變量到 memory 中, 而不能放置到處理器的 register 中(代碼會變大變慢). 另外也不能有助于優(yōu)化器進行優(yōu)化.

 

7.       *(2的倍數(shù)), 或 /(2的倍數(shù)), 使用 “<<” 以及 “>>” 操作.

 

8.   應(yīng)保持?jǐn)?shù)據(jù)變量的type 定義的一致性, 在運算中, 盡量減少類似 U32 -> U16 -> U32 的不必要的強制轉(zhuǎn)化過程.

 

9.   定義字符串為全局變量, 在 ram 富余的情況下, 這是一個利用 ram 來分擔(dān)降低 code size 的技巧.

構(gòu)建代碼的過程, 不僅僅是理性思維落實為真實世界邏輯的過程, 我們覺得, 也是和編譯器進行交互的過程. 我們所作所為, 需要實現(xiàn)目的之邏輯, 我覺得也需要, "討好"編譯器, 讓它為我們的代碼, 生產(chǎn) size 和 speed 都得到優(yōu)化的job.

 

如何優(yōu)化C語言代碼

來源:互聯(lián)網(wǎng) 時間:2008-02-23
西部數(shù)碼-全國虛擬主機10強!40余項虛擬主機管理功能,全國領(lǐng)先!雙線多線虛擬主機南北訪問暢通無阻!免費贈送企業(yè)郵局,.CN域名,自助建站480元起,免費試用7天,滿意再付款! VPS主機租用266元/月(1G內(nèi)存)!
 1、選擇合適的算法和數(shù)據(jù)結(jié)構(gòu) 
  應(yīng)該熟悉算法語言,知道各種算法的優(yōu)缺點,具體資料請參見相應(yīng)的參考資料,有很多電腦書籍上都有介紹。將比較慢的順序查找法用較快的二分查找或亂序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都能夠大大提高程式執(zhí)行的效率。.選擇一種合適的數(shù)據(jù)結(jié)構(gòu)也很重要,比如您在一堆隨機存放的數(shù)中使用了大量的插入和刪除指令,那使用鏈表要快得多。數(shù)組和指針語句具備十分密碼的關(guān)系,一般來說,指針比較靈活簡潔,而數(shù)組則比較直觀,容易理解。對于大部分的編譯器,使用指針比使用數(shù)組生成的代碼更短,執(zhí)行效率更高。但是在Keil中則相反,使用數(shù)組比使用的指針生成的代碼更短。。 

  2。。。

  3、使用盡量小的數(shù)據(jù)類型
 
能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。當(dāng)然,在定義變量后不要超過變量的作用范圍,假如超過變量的范圍賦值,C編譯器并不報錯,但程式運行結(jié)果卻錯了,而且這樣的錯誤很難發(fā)現(xiàn)。 
在ICCAVR中,能夠在Options中設(shè)定使用printf參數(shù),盡量使用基本型參數(shù)(%c、 版權(quán)申明:本站文章均來自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系028-86262244-215,我們收到后立即刪除,謝謝! 
%d、%x、%X、%u和%s格式說明符),少用長整型參數(shù)(%ld、%lu、%lx和%lX格式說明 符),至于浮點型的參數(shù)(%f)則盡量不要使用,其他C編譯器也相同。在其他條件不 變的情況下,使用%f參數(shù),會使生成的代碼的數(shù)量增加很多,執(zhí)行速度降低。 

  4、使用自加、自減指令 
  通常使用自加、自減指令和復(fù)合賦值表達式(如a-=1及a =1等)都能夠生成高質(zhì)量的
程式代碼,編譯器通常都能夠生成inc和dec之類的指令,而使用a=a 1或a=a-1之類
的指令,有很多C編譯器都會生成二到三個字節(jié)的指令。在AVR單片適用的ICCAVR、 GCCAVR、IAR等C編譯器以上幾種書寫方式生成的代碼是相同的,也能夠生成高質(zhì)量 的inc和dec之類的的代碼。 

  5、減少運算的強度 
  能夠使用運算量小但功能相同的表達式替換原來復(fù)雜的的表達式。如下: 

(1)、求余運算。 
a=a%8; 
能夠改為: 
a=a&7; 
說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調(diào) 用子程式來完成,代碼長、執(zhí)行速度慢。通常,只需要是求2n方的余數(shù),均可使用 位操作的方法來代替。 

(2)、平方運算 
a=pow(a,2.0); 
能夠改為: 
a=a*a; 
說明:在有內(nèi)置硬件乘法器的單片機中(如51系列),乘法運算比求平方運算快得多,因為浮點數(shù)的求平方是通過調(diào)用子程式來實現(xiàn)的,在自帶硬件乘法器的AVR單片機中,如ATMega163中,乘法運算只需2個時鐘周期就能夠完成。既使是在沒有內(nèi)置 硬件乘法器的AVR單片機中,乘法運算的子程式比平方運算的子程式代碼短,執(zhí)行速度快。 特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點,本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系. 
假如是求3次方,如: 
a=pow(a,3.0); 
更改為: 
a=a*a*a; 
則效率的改善更明顯。 

(3)、用移位實現(xiàn)乘除法運算 
a=a*4; 
b=b/4; 
能夠改為: 
a=a<<2; 
b=b>>2; 
說明:通常假如需要乘以或除以2n,都能夠用移位的方法代替。在ICCAVR中,假如 乘以2n,都能夠生成左移的代碼,而乘以其他的整數(shù)或除以任何數(shù),均調(diào)用乘除法 子程式。用移位的方法得到代碼比調(diào)用乘除法子程式生成的代碼效率高。實際上, 只要是乘以或除以一個整數(shù),均能夠用移位的方法得到結(jié)果,如: 
a=a*9 
能夠改為: 
a=(a<<3) a 

  6、循環(huán) 

(1)、循環(huán)語 
對于一些無需循環(huán)變量參加運算的任務(wù)能夠把他們放到循環(huán)外面,這里的任務(wù)包括表達式、函數(shù)的調(diào)用、指針運算、數(shù)組訪問等,應(yīng)該將沒有必要執(zhí)行多次的操作全部集合在一起,放到一個init的初始化程式中進行。 

(2)、延時函數(shù): 
通常使用的延時函數(shù)均采用自加的形式: 
void delay (void) 

unsigned int i; 
for (i=0;i<1000;i ) 


將其改為自減延時函數(shù): 
void delay (void) 

unsigned int i; 
for (i=1000;i>0;i--) .. 


  兩個函數(shù)的延時效果相似,但幾乎任何的C編譯對后一種函數(shù)生成的代碼均比前一種代碼少1~3個字節(jié),因為幾乎任何的MCU均有為0轉(zhuǎn)移的指令,采用后一種方式能夠生成這類指令。在使用while循環(huán)時也相同,使用自減指令控制循環(huán)會比使用自加指令控制循環(huán)生成的代碼更少1~3個字母。但是在循環(huán)中有通過循環(huán)變量“i”讀寫數(shù)組的指令時,使用預(yù)減循環(huán)時有可能使數(shù)組超界,要引起注意。 

(3)while循環(huán)和do…while循環(huán) 
用while循環(huán)時有以下兩種循環(huán)形式: 
unsigned int i; 
i=0; 
while (i<1000) 

i ; 
//用戶程式 

或: 
unsigned int i; 
i=1000; 
do 
i--; 
//用戶程式 
while (i>0); 
在這兩種循環(huán)中,使用do…while循環(huán)編譯后生成的代碼的長度短于while循環(huán)。 

  7、查表 
  在程式中一般不進行很復(fù)雜的運算,如浮點數(shù)的乘除及開方等,連同一些復(fù)雜的數(shù)學(xué)模型的插補運算,對這些即消耗時間又消費資源的運算,應(yīng)盡量使用查表的方式,并且將數(shù)據(jù)表置于程式存儲區(qū)。假如直接生成所需的表比較困難,也盡量在啟了,減少了程式執(zhí)行過程中重復(fù)計算的工作量。 

  8、其他 
  比如使用在線匯編及將字符串和一些常量保存在程式存儲器中,均有利于優(yōu)化
 
如何優(yōu)化C語言代碼(程序員必讀)------(1)

如何優(yōu)化C語言代碼(程序員必讀)[轉(zhuǎn)]http://www./ 2008-11-17  網(wǎng)絡(luò) 點擊:69  [ 評論 ]
文章搜索:     【點擊打包該文章】 被過濾廣告 
【本站開通在線QQ討論群】

1、選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)
      應(yīng)該熟悉算法語言,知道各種算法的優(yōu)缺點,具體資料請參見相應(yīng)的參考資料,有很多計算機書籍上都有介紹。將比較慢的順序查找法用較快的二分查找或亂序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序執(zhí)行的效率。.選擇一種合適的數(shù)據(jù)結(jié)構(gòu)也很重要,比如你在一堆隨機存放的數(shù)中使用了大量的插入和刪除指令,那使用鏈表要快得多。數(shù)組與指針語句具有十分緊密的關(guān)系,一般來說,指針比較靈活簡潔,而數(shù)組則比較直觀,容易理解。對于大部分的編譯器,使用指針比使用數(shù)組生成的代碼更短,執(zhí)行效率更高。但是在Keil中則相反,使用數(shù)組比使用的指針生成的代碼更短。。


3、使用盡量小的數(shù)據(jù)類型
      能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。當(dāng)然,在定義變量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C編譯器并不報錯,但程序運行結(jié)果卻錯了,而且這樣的錯誤很難發(fā)現(xiàn)。
      在ICCAVR中,可以在Options中設(shè)定使用printf參數(shù),盡量使用基本型參數(shù)(%c、%d、%x、%X、%u和%s格式說明符),少用長整型參數(shù)(%ld、%lu、%lx和%lX格式說明符),至于浮點型的參數(shù)(%f)則盡量不要使用,其它C編譯器也一樣。在其它條件不變的情況下,使用%f參數(shù),會使生成的代碼的數(shù)量增加很多,執(zhí)行速度降低。

4、使用自加、自減指令
      通常使用自加、自減指令和復(fù)合賦值表達式(如a-=1及a+=1等)都能夠生成高質(zhì)量的程序代碼,編譯器通常都能夠生成inc和dec之類的指令,而使用 a=a+1或a=a-1之類的指令,有很多C編譯器都會生成二到三個字節(jié)的指令。在AVR單片適用的ICCAVR、GCCAVR、IAR等C編譯器以上幾種書寫方式生成的代碼是一樣的,也能夠生成高質(zhì)量的inc和dec之類的的代碼。

5、減少運算的強度
      可以使用運算量小但功能相同的表達式替換原來復(fù)雜的的表達式。如下:
(1)、求余運算。
        a=a%8;
可以改為:
        a=a&7;

說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的“%”運算均是調(diào)用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來代替。

(2)、平方運算
        a=pow(a,2.0);
可以改為:
        a=a*a;

說明:在有內(nèi)置硬件乘法器的單片機中(如51系列),乘法運算比求平方運算快得多,因為浮點數(shù)的求平方是通過調(diào)用子程序來實現(xiàn)的,在自帶硬件乘法器的AVR 單片機中,如ATMega163中,乘法運算只需2個時鐘周期就可以完成。既使是在沒有內(nèi)置硬件乘法器的AVR單片機中,乘法運算的子程序比平方運算的子程序代碼短,執(zhí)行速度快。

如果是求3次方,如:
        a=pow(a,3.0);
更改為:
        a=a*a*a;
則效率的改善更明顯。

(3)、用移位實現(xiàn)乘除法運算
        a=a*4;
        b=b/4;
可以改為:
        a=a<<2;
        b=b>>2;

說明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代碼,而乘以其它的整數(shù)或除以任何數(shù),均調(diào)用乘除法子程序。用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數(shù),均可以用移位的方法得到結(jié)果,如:
        a=a*9
可以改為:
        a=(a<<3)+a

6、循環(huán)
(1)、循環(huán)語
      對于一些不需要循環(huán)變量參加運算的任務(wù)可以把它們放到循環(huán)外面,這里的任務(wù)包括表達式、函數(shù)的調(diào)用、指針運算、數(shù)組訪問等,應(yīng)該將沒有必要執(zhí)行多次的操作全部集合在一起,放到一個init的初始化程序中進行。

(2)、延時函數(shù):
通常使用的延時函數(shù)均采用自加的形式:
        void delay (void)
        {
unsigned int i;
        for (i=0;i<1000;i++)
        ;
        }
將其改為自減延時函數(shù):
        void delay (void)
        {
unsigned int i;
            for (i=1000;i>0;i--)
        ;
        }

      兩個函數(shù)的延時效果相似,但幾乎所有的C編譯對后一種函數(shù)生成的代碼均比前一種代碼少1~3個字節(jié),因為幾乎所有的MCU均有為0轉(zhuǎn)移的指令,采用后一種方式能夠生成這類指令。在使用while循環(huán)時也一樣,使用自減指令控制循環(huán)會比使用自加指令控制循環(huán)生成的代碼更少1~3個字母。但是在循環(huán)中有通過循環(huán)變量“i”讀寫數(shù)組的指令時,使用預(yù)減循環(huán)時有可能使數(shù)組超界,要引起注意。

(3)while循環(huán)和do…while循環(huán)
用while循環(huán)時有以下兩種循環(huán)形式:
unsigned int i;
        i=0;
        while (i<1000)
        {
            i++;
        //用戶程序
        }
或:
unsigned int i;
        i=1000;
        do
        i--;
        //用戶程序
        while (i>0);
      在這兩種循環(huán)中,使用do…while循環(huán)編譯后生成的代碼的長度短于while循環(huán)。

7、查表
      在程序中一般不進行非常復(fù)雜的運算,如浮點數(shù)的乘除及開方等,以及一些復(fù)雜的數(shù)學(xué)模型的插補運算,對這些即消耗時間又消費資源的運算,應(yīng)盡量使用查表的方式,并且將數(shù)據(jù)表置于程序存儲區(qū)。如果直接生成所需的表比較困難,也盡量在啟了,減少了程序執(zhí)行過程中重復(fù)計算的工作量。

8、其它
比如使用在線匯編及將字符串和一些常量保存在程序存儲器中,均有利于優(yōu)化


嵌入式實時程序設(shè)計中C/C++代碼的優(yōu)化

1 引言

      計算機技術(shù)和信息技術(shù)的高速發(fā)展的今天,計算機和計算機技術(shù)大量應(yīng)用在人們的日常生活中,嵌入式計算機也得到了廣泛的應(yīng)用。 嵌入式計算機是指完成一種或多種特定功能的計算機系統(tǒng),是軟硬件的緊密結(jié)合體。具有軟件代碼小、高度自動化、響應(yīng)速度快等特點。 特別適合于要求實時和多任務(wù)的應(yīng)用體系。嵌入式實時系統(tǒng)是目前蓬勃發(fā)展的行業(yè)之一。      但是,實時嵌入式系統(tǒng)的特點使得其軟件受時間和空間的嚴(yán)格限制,加上運行環(huán)境復(fù)雜,使得嵌入式系統(tǒng)軟件的開發(fā)變得異常困難。 為了設(shè)計一個滿足功能、性能和死線要求的系統(tǒng),為了開發(fā)出安全可靠的高性能嵌入式系統(tǒng),開發(fā)語言的選擇十分重要。 
2 嵌入式實時程序設(shè)計中語言的選擇

    
隨著嵌入式系統(tǒng)應(yīng)用范圍的不斷擴大和嵌入式實時操作系統(tǒng)RTOS(Real Time Operating System)的廣泛使用,高級語言編程已是嵌入式系統(tǒng)設(shè)計的必然趨勢。因為匯編語言和具體的微處理器的硬件結(jié)構(gòu)密切相關(guān),移植性較差,既不宜在復(fù)雜系統(tǒng)中使用,又不便于實現(xiàn)軟件重用;而高級語言具有良好的通用性和豐富的軟件支持,便于推廣、易于維護,因此高級語言編程具有許多優(yōu)勢。目前,在嵌入式系統(tǒng)開發(fā)過程中使用的語言種類很多,但僅有少數(shù)幾種語言得到了比較廣泛的應(yīng)用。其中C和C++是應(yīng)用最廣泛的。C++在支持現(xiàn)代軟件工程、 OOP(Object Oriented Programming,面向?qū)ο蟮某绦蛟O(shè)計)、結(jié)構(gòu)化等方面對C進行了卓有成效的改進,但在程序代碼容量、執(zhí)行速度、程序復(fù)雜程度等方面比C語言程序性能差一些。由于C語言既有低級語言的直接控制硬件的能力,又有高級語言的靈活性,是目前在嵌入式系統(tǒng)中應(yīng)用最廣泛的編程語言。隨著網(wǎng)絡(luò)技術(shù)和嵌入式技術(shù)的不斷發(fā)展,Java的應(yīng)用也得到廣泛應(yīng)用。

3 C/C++代碼在實時程序設(shè)計中的優(yōu)化

    
雖然使軟件正確是一個工程合乎邏輯的最后一個步驟,但是在嵌入式的系統(tǒng)開發(fā)中,情況并不總是這樣的。出于對低價產(chǎn)品的需求, 硬件的設(shè)計者需要提供剛好足夠的存儲器和完成工作的處理能力。所以在嵌入式軟件設(shè)計的最后一個階段則變成了對代碼的優(yōu)化。   

現(xiàn)代的C和C++編譯器都提供了一定程度上的代碼優(yōu)化。然而,大部分由編譯器執(zhí)行的優(yōu)化僅涉及執(zhí)行速度和代碼大小的一個平衡。你的程序能夠變得更快或者更小,但是不可能又變快又變小。經(jīng)過本人在嵌入式系統(tǒng)設(shè)計和實現(xiàn)過程中實踐,下面介紹幾種簡單且行之有效的C/C++代碼的優(yōu)化方法。

      (1) Inline函數(shù)

      在C++中,關(guān)鍵字Inline可以被加入到任何函數(shù)的聲明中。這個關(guān)鍵字請求編譯器用函數(shù)內(nèi)部的代碼替換所有對于指出的函數(shù)的調(diào)用。這樣做在兩個方面快于函數(shù)調(diào)用。這樣做在兩個方面快于函數(shù)調(diào)用:第一,省去了調(diào)用指令需要的執(zhí)行時間;第二,省去了傳遞變元和傳遞過程需要的時間。但是使用這種方法在優(yōu)化程序速度的同時,程序長度變大了,因此需要更多的ROM。使用這種優(yōu)化在Inline函數(shù)頻繁調(diào)用并且只包含幾行代碼的時候是最有效的。 
      (2)用指針代替數(shù)組

      在許多種情況下,可以用指針運算代替數(shù)組索引,這樣做常常能產(chǎn)生又快又短的代碼。與數(shù)組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數(shù)組時差異更明顯。下面的代碼作用是相同的,但是效率不一樣。 
      數(shù)組索引                  指針運算 
      For(;;){                  p=array 
      A=array[t++];            for(;;){ 
                                  a=*(p++); 
      ......                      ...... 
      }                        }

      指針方法的優(yōu)點是,array的地址每次裝入地址p后,在每次循環(huán)中只需對p增量操作。在數(shù)組索引方法中,每次循環(huán)中都必須進行基于t值求數(shù)組下標(biāo)的復(fù)雜運算。 
      (3)不定義不使用的返回值

      function函數(shù)定義并不知道函數(shù)返回值是否被使用,假如返回值從來不會被用到,應(yīng)該使用void來明確聲明函數(shù)不返回任何值。

      (4)手動編寫匯編

      在嵌入式軟件開發(fā)中,一些軟件模塊最好用匯編語言來寫,這可以使程序更加有效。雖然C/C++編譯器對代碼進行了優(yōu)化,但是適當(dāng)?shù)氖褂脙?nèi)聯(lián)匯編指令可以有效的提高整個系統(tǒng)運行的效率。 
      (5)使用寄存器變量

      在聲明局部變量的時候可以使用register關(guān)鍵字。這就使得編譯器把變量放入一個多用途的寄存器中,而不是在堆棧中,合理使用這種方法可以提高執(zhí)行速度。函數(shù)調(diào)用越是頻繁,越是可能提高代碼的速度。 
      (6)使用增量和減量操作符

      在使用到加一和減一操作時盡量使用增量和減量操作符,因為增量符語句比賦值語句更快,原因在于對大多數(shù)CPU來說,對內(nèi)存字的增、 減量操作不必明顯地使用取內(nèi)存和寫內(nèi)存的指令,比如下面這條語句: 
      x=x+1; 
      模仿大多數(shù)微機匯編語言為例,產(chǎn)生的代碼類似于: 
      move A,x        ;把x從內(nèi)存取出存入累加器A 
      add A,1        ;累加器A加1 
      store x        ;把新值存回x

      如果使用增量操作符,生成的代碼如下: 
      incr x          ;x加1 
      顯然,不用取指令和存指令,增、減量操作執(zhí)行的速度加快,同時長度也縮短了。

      (7)減少函數(shù)調(diào)用參數(shù)

      使用全局變量比函數(shù)傳遞參數(shù)更加有效率。這樣做去除了函數(shù)調(diào)用參數(shù)入棧和函數(shù)完成后參數(shù)出棧所需要的時間。然而決定使用全局變量會影響程序的模塊化和重入,故要慎重使用。 
      (8)Switch語句中根據(jù)發(fā)生頻率來進行case排序

      switch語句是一個普通的編程技術(shù),編譯器會產(chǎn)生if-else-if的嵌套代碼,并按照順序進行比較,發(fā)現(xiàn)匹配時,就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。使用時需要注意。每一個由機器語言實現(xiàn)的測試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么,就把寶貴的處理器時間耗盡。為了提高速度,沒法把具體的情況按照它們發(fā)生的相對頻率排序。換句話說,把最可能發(fā)生的情況放在第一位,最不可能的情況放在最后。 
      (9)將大的switch語句轉(zhuǎn)為嵌套switch語句

      當(dāng)switch語句中的case標(biāo)號很多時,為了減少比較的次數(shù),明智的做法是把大switch語句轉(zhuǎn)為嵌套switch語句。把發(fā)生頻率高的case 標(biāo)號放在一個switch語句中,并且是嵌套switch語句的最外層,發(fā)生相對頻率相對低的case標(biāo)號放在另一個switch語句中。比如,下面的程序段把相對發(fā)生頻率低的情況放在缺省的case標(biāo)號內(nèi)。          pMsg=ReceiveMessage(); 
          switch (pMsg->type) 
          { 
          case FREQUENT_MSG1: 
          handleFrequentMsg(); 
          break; 
          case FREQUENT_MSG2: 
          handleFrequentMsg2(); 
          break; 
          ...... 
          case FREQUENT_MSGn: 
          handleFrequentMsgn(); 
          break; 
          default:                        //嵌套部分用來處理不經(jīng)常發(fā)生的消息 
          switch (pMsg->type) 
          { 
          case INFREQUENT_MSG1: 
          handleInfrequentMsg1(); 
          break; 
          case INFREQUENT_MSG2: 
          handleInfrequentMsg

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多