C語言中級(jí)教程編程效率17_第1頁
C語言中級(jí)教程編程效率17_第2頁
C語言中級(jí)教程編程效率17_第3頁
C語言中級(jí)教程編程效率17_第4頁
C語言中級(jí)教程編程效率17_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C語言中級(jí)培訓(xùn)十一、編程效率關(guān)于程序效率(1) 沒有意識(shí)到程序效率的編碼者,可能會(huì)寫如下的代碼: for(i=0;i1000;i+) GetLocalHostName(hostname);. GetLocalHostName的意思是取得當(dāng)前計(jì)算機(jī)名。實(shí)際上取得一次機(jī)器的名字就可以,而把它放在循環(huán)體中,它就被調(diào)用了1000次,有999次是多余的。 如果沒有意識(shí)到無效率行為的危害,程序中多次出現(xiàn)如此效率低下的行為,那么程序運(yùn)行會(huì)非常慢,有時(shí)會(huì)慢得使用戶難以接受。區(qū)分老手和新手的試金石: 求n! .張嘴就喊簡(jiǎn)單的人肯定是新手。老手首先會(huì)問這n可能會(huì)多大?然后會(huì)提出幾種解決方案,如函數(shù)法、靜態(tài)變量法、

2、迭代法、遞歸法等,并且評(píng)估各自的復(fù)雜度和優(yōu)缺點(diǎn)。最后確定一種方案。僅僅能寫出代碼來的人不是真正的程序員,編程對(duì)程序員的要求是很高的。關(guān)于程序效率(2)程序效率程序效率,是用執(zhí)行的步驟(step)數(shù)(時(shí)間復(fù)雜度)、占內(nèi)存的多少(空間復(fù)雜度)來衡量的。完成某項(xiàng)工作,執(zhí)行的步驟(step)的次數(shù)最少、占用內(nèi)存最小是程序員所追求的。特別是嵌入式系統(tǒng)的開發(fā),內(nèi)存等資源都是有限的。因此,提高效率的著眼點(diǎn)應(yīng)該是:減少執(zhí)行次數(shù)減少占用空間 如何提高程序效率(1)效率改善的指導(dǎo)原則:在滿足正確性、可靠性、健壯性、可讀性等質(zhì)量因素的前提下,設(shè)法提高程序的效率;如果程序的正確性、可靠性得不到保證,提高效率就失去了根

3、本;如果程序的健壯性得不到保證,提高效率就失去了目標(biāo);如果程序的可讀性得不到保證,提高效率就失去了方向;如何提高程序效率(2)以提高程序的全局效率為主,提高局部效率為輔;如果只從局部角度出發(fā),局部效率的改善一般對(duì)全局效率改善作用不大,有時(shí)甚至影響全局效率的改善;應(yīng)該從全局角度出發(fā),整體考慮,作出統(tǒng)一改善的調(diào)整,有的時(shí)候局部利益為配合整體需要應(yīng)作出犧牲;如何提高程序效率(3)在優(yōu)化程序的效率時(shí),應(yīng)當(dāng)先找出限制效率的“瓶頸”關(guān)鍵點(diǎn):非關(guān)鍵點(diǎn)的改善,不會(huì)根本改變效率的現(xiàn)狀;先進(jìn)行一些基準(zhǔn)數(shù)據(jù)測(cè)量和問題收集,尋找提高效率的關(guān)鍵點(diǎn);有時(shí)一次關(guān)鍵的改動(dòng)還不能解決問題,還需要進(jìn)一步的數(shù)據(jù)測(cè)量和持續(xù)的改進(jìn),直

4、到符合要求;如何提高程序效率(4)先優(yōu)化數(shù)據(jù)結(jié)構(gòu)和算法,再優(yōu)化執(zhí)行代碼;因?yàn)镺(n2)的算法寫不出O(nlog2n)的程序,因此寫程序前應(yīng)該考慮數(shù)據(jù)結(jié)構(gòu)和算法的選擇和優(yōu)化;如果你已經(jīng)選擇了正確的算法,那么到了寫程序時(shí),才有可能去關(guān)心執(zhí)行代碼的優(yōu)化問題;如何提高程序效率(5)時(shí)間效率和空間效率可能對(duì)立,此時(shí)應(yīng)當(dāng)分析、權(quán)衡哪個(gè)更重要,作出適當(dāng)?shù)恼壑?;一般來講,在空間允許的時(shí)候,我們會(huì)花費(fèi)空間換取時(shí)間效率的大幅提升;在時(shí)間效率和空間對(duì)立的時(shí)候,我們應(yīng)根據(jù)需要,在兩者之間作出適當(dāng)折中;如何提高程序效率(6)時(shí)間效率改善的措施減少內(nèi)存分配的次數(shù)一次能夠申請(qǐng)的內(nèi)存,就不要多次申請(qǐng);函數(shù)中的存儲(chǔ)會(huì)被多次訪問

5、 ,“相對(duì)不變量”的變量請(qǐng)定義成為static。如:GetLocalHostName(char*name)charfuncName=GetLocalHostName; sys_log(%sbegin.,funcName);.sys_log(%send.,funcName);如果這是一個(gè)經(jīng)常調(diào)用的函數(shù),每次調(diào)用時(shí)都要對(duì)funcName分配內(nèi)存,這個(gè)開銷很大。把這個(gè)變量聲明成static,當(dāng)函數(shù)再次被調(diào)用時(shí),就會(huì)省去了分配內(nèi)存的開銷,執(zhí)行效率很好。 如何提高程序效率(7)時(shí)間效率改善的措施提高循環(huán)體效率減少循環(huán)次數(shù)減少循環(huán)體內(nèi)執(zhí)行語句的數(shù)量例子參見1.1 關(guān)于程序效率序中的例子如何提高程序效率(8

6、)在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將長的循環(huán)放在最內(nèi)層,短的循環(huán)放在最外層,以減少CPU 跨切循環(huán)層的次數(shù)。下例a和b的功能一樣,但效率不同: 例a: for (i=0; i5;i+) /5次切換 for (j=0; j100; j+) Dothing(); 例b: for (j=0; j100;j+) /100次切換 for (i=0; i)使用很方便,但實(shí)際運(yùn)行往往需要進(jìn)行地址計(jì)算;不必要的地址計(jì)算會(huì)導(dǎo)致性能下降;盡可能減少-的多級(jí)嵌套。如何提高程序效率(10)提高數(shù)學(xué)表達(dá)式的效率a*b + a*c = a*(b+c); 減少一次乘法,但不改變表達(dá)式的意義。b/a + c/a = (1/a)

7、*(b+c); 把兩次除法變成一次除法和一次乘法,在幾乎所有的平臺(tái)上,除法都比乘法慢。(a | b ) & c ) = c & ( a | b ); 當(dāng)c為假時(shí),前一個(gè)表達(dá)式要計(jì)算( a | b ),后個(gè)表達(dá)式則不計(jì)算。如何提高程序效率(11)空間效率改善的考慮合理定義結(jié)構(gòu)體成員順序:按照類型從小到大,相同類型連續(xù)存放。如: AA_t和BB_t所占用的空間是不同的:typedef struct short a; int b; short c; AA_t;typedef struct short a; short c; int b;BB_t;如何提高程序效率(12)冗余數(shù)據(jù)壓縮,可以減少對(duì)內(nèi)存的

8、占用 如有些矩陣數(shù)據(jù)的存儲(chǔ)。有些矩陣中的非零元素很少,可以考慮通過只存儲(chǔ)非零數(shù)據(jù)來減少對(duì)存儲(chǔ)空間的占用。動(dòng)態(tài)內(nèi)存使用的方式,可以提高內(nèi)存的利用率。 追求空間的效率和追求時(shí)間的效率,往往是矛盾的,需要全面權(quán)衡,不可偏廢。如何提高程序效率(13)減少代碼的行數(shù)可以減少ROM的占用 對(duì)于嵌入系統(tǒng)而言,ROM資源是很寶貴的。減少代碼行數(shù)是減少ROM占用量的有效途徑;減少代碼行的方法:消除冗余代碼,可以有效減少代碼行數(shù)通過函數(shù)指針和函數(shù)表,可以減少程序代碼規(guī)模實(shí)例(1)效率改善的例 A:請(qǐng)看下面的代碼: for( int i = 0; i back-surf-bitsi= value; 如下修改是否更好

9、 將3層指針變?yōu)閿?shù)組名: unsigned char *b_s_b =context-back-surf-bits; for( int i = 0; i back-surf-bits; for(;b_s_b numPixels; b_s_b+) *b_s_b = value; 實(shí)例(2)效率改善的例B 有一組函數(shù):functionA, functionB, functionZ,它們分別是對(duì)26種不同狀態(tài)(A,B,Z)的處理。它們的函數(shù)形式如下: int functionA(int event); int functionB(int event); . int functionZ(int eve

10、nt);下面代碼對(duì),但效率不高,是新手的代碼。 switch (status) case A: functionA(event);break; case B: functionB(event);break; case Z: functionZ(event);break; 實(shí)例(3)缺陷是:生成目標(biāo)代碼體積大,且可維護(hù)性弱。可以這樣來解決: typdef int (*pFunc)(int event); / pFunc 是 int (*)(int event)的別名 typedef enum A =0,B, ,Z Status_t; pFunc functionlistZ+1 = functionA, functionB, ,functionZ ; /指向函數(shù)名串的指針數(shù)組 Status_t status; /然后 status被賦值 functionliststatus(event);這么做是不是更好?這是老手的代碼。第二部分 問題與習(xí)題問題表(1)Q1:請(qǐng)問(i)比 (ii)哪個(gè)效率高?(i) if (condition) for ( i=0; i N; i +) DoSomething(); else for ( i=0; i N; i +) DoOtherthing()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論