版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言中級培訓十一、編程效率關于程序效率(1) 沒有意識到程序效率的編碼者,可能會寫如下的代碼: for(i=0;i1000;i+) GetLocalHostName(hostname);. GetLocalHostName的意思是取得當前計算機名。實際上取得一次機器的名字就可以,而把它放在循環(huán)體中,它就被調(diào)用了1000次,有999次是多余的。 如果沒有意識到無效率行為的危害,程序中多次出現(xiàn)如此效率低下的行為,那么程序運行會非常慢,有時會慢得使用戶難以接受。區(qū)分老手和新手的試金石: 求n! .張嘴就喊簡單的人肯定是新手。老手首先會問這n可能會多大?然后會提出幾種解決方案,如函數(shù)法、靜態(tài)變量法、
2、迭代法、遞歸法等,并且評估各自的復雜度和優(yōu)缺點。最后確定一種方案。僅僅能寫出代碼來的人不是真正的程序員,編程對程序員的要求是很高的。關于程序效率(2)程序效率程序效率,是用執(zhí)行的步驟(step)數(shù)(時間復雜度)、占內(nèi)存的多少(空間復雜度)來衡量的。完成某項工作,執(zhí)行的步驟(step)的次數(shù)最少、占用內(nèi)存最小是程序員所追求的。特別是嵌入式系統(tǒng)的開發(fā),內(nèi)存等資源都是有限的。因此,提高效率的著眼點應該是:減少執(zhí)行次數(shù)減少占用空間 如何提高程序效率(1)效率改善的指導原則:在滿足正確性、可靠性、健壯性、可讀性等質(zhì)量因素的前提下,設法提高程序的效率;如果程序的正確性、可靠性得不到保證,提高效率就失去了根
3、本;如果程序的健壯性得不到保證,提高效率就失去了目標;如果程序的可讀性得不到保證,提高效率就失去了方向;如何提高程序效率(2)以提高程序的全局效率為主,提高局部效率為輔;如果只從局部角度出發(fā),局部效率的改善一般對全局效率改善作用不大,有時甚至影響全局效率的改善;應該從全局角度出發(fā),整體考慮,作出統(tǒng)一改善的調(diào)整,有的時候局部利益為配合整體需要應作出犧牲;如何提高程序效率(3)在優(yōu)化程序的效率時,應當先找出限制效率的“瓶頸”關鍵點:非關鍵點的改善,不會根本改變效率的現(xiàn)狀;先進行一些基準數(shù)據(jù)測量和問題收集,尋找提高效率的關鍵點;有時一次關鍵的改動還不能解決問題,還需要進一步的數(shù)據(jù)測量和持續(xù)的改進,直
4、到符合要求;如何提高程序效率(4)先優(yōu)化數(shù)據(jù)結構和算法,再優(yōu)化執(zhí)行代碼;因為O(n2)的算法寫不出O(nlog2n)的程序,因此寫程序前應該考慮數(shù)據(jù)結構和算法的選擇和優(yōu)化;如果你已經(jīng)選擇了正確的算法,那么到了寫程序時,才有可能去關心執(zhí)行代碼的優(yōu)化問題;如何提高程序效率(5)時間效率和空間效率可能對立,此時應當分析、權衡哪個更重要,作出適當?shù)恼壑?;一般來講,在空間允許的時候,我們會花費空間換取時間效率的大幅提升;在時間效率和空間對立的時候,我們應根據(jù)需要,在兩者之間作出適當折中;如何提高程序效率(6)時間效率改善的措施減少內(nèi)存分配的次數(shù)一次能夠申請的內(nèi)存,就不要多次申請;函數(shù)中的存儲會被多次訪問
5、 ,“相對不變量”的變量請定義成為static。如:GetLocalHostName(char*name)charfuncName=GetLocalHostName; sys_log(%sbegin.,funcName);.sys_log(%send.,funcName);如果這是一個經(jīng)常調(diào)用的函數(shù),每次調(diào)用時都要對funcName分配內(nèi)存,這個開銷很大。把這個變量聲明成static,當函數(shù)再次被調(diào)用時,就會省去了分配內(nèi)存的開銷,執(zhí)行效率很好。 如何提高程序效率(7)時間效率改善的措施提高循環(huán)體效率減少循環(huán)次數(shù)減少循環(huán)體內(nèi)執(zhí)行語句的數(shù)量例子參見1.1 關于程序效率序中的例子如何提高程序效率(8
6、)在多重循環(huán)中,如果有可能,應當將長的循環(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)使用很方便,但實際運行往往需要進行地址計算;不必要的地址計算會導致性能下降;盡可能減少-的多級嵌套。如何提高程序效率(10)提高數(shù)學表達式的效率a*b + a*c = a*(b+c); 減少一次乘法,但不改變表達式的意義。b/a + c/a = (1/a)
7、*(b+c); 把兩次除法變成一次除法和一次乘法,在幾乎所有的平臺上,除法都比乘法慢。(a | b ) & c ) = c & ( a | b ); 當c為假時,前一個表達式要計算( a | b ),后個表達式則不計算。如何提高程序效率(11)空間效率改善的考慮合理定義結構體成員順序:按照類型從小到大,相同類型連續(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ù)壓縮,可以減少對內(nèi)存的
8、占用 如有些矩陣數(shù)據(jù)的存儲。有些矩陣中的非零元素很少,可以考慮通過只存儲非零數(shù)據(jù)來減少對存儲空間的占用。動態(tài)內(nèi)存使用的方式,可以提高內(nèi)存的利用率。 追求空間的效率和追求時間的效率,往往是矛盾的,需要全面權衡,不可偏廢。如何提高程序效率(13)減少代碼的行數(shù)可以減少ROM的占用 對于嵌入系統(tǒng)而言,ROM資源是很寶貴的。減少代碼行數(shù)是減少ROM占用量的有效途徑;減少代碼行的方法:消除冗余代碼,可以有效減少代碼行數(shù)通過函數(shù)指針和函數(shù)表,可以減少程序代碼規(guī)模實例(1)效率改善的例 A:請看下面的代碼: 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; 實例(2)效率改善的例B 有一組函數(shù):functionA, functionB, functionZ,它們分別是對26種不同狀態(tài)(A,B,Z)的處理。它們的函數(shù)形式如下: int functionA(int event); int functionB(int event); . int functionZ(int eve
10、nt);下面代碼對,但效率不高,是新手的代碼。 switch (status) case A: functionA(event);break; case B: functionB(event);break; case Z: functionZ(event);break; 實例(3)缺陷是:生成目標代碼體積大,且可維護性弱??梢赃@樣來解決: 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);這么做是不是更好?這是老手的代碼。第二部分 問題與習題問題表(1)Q1:請問(i)比 (ii)哪個效率高?(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新版商品房包銷合同3篇
- 招標文件確認紀要3篇
- 教育培訓服務用工合同范例3篇
- 開庭委托書寫作要點詳解3篇
- 政府跟保險公司合作協(xié)議3篇
- 文物流運輸招標要求3篇
- 放射性廢物管理工程師勞動合同3篇
- 擋土墻建設合同樣本3篇
- 攜手同行的研學合作協(xié)議3篇
- 旅游業(yè)客戶信息保護3篇
- 實+用英語語音(山東聯(lián)盟)智慧樹知到期末考試答案章節(jié)答案2024年曲阜師范大學
- 2023-2024學年安徽省安慶市宿松縣八年級(上)期末數(shù)學試卷
- 《電化學儲能電站運行維護規(guī)程》
- 學前兒童游戲指導形成性考核二
- 01中國電信云計算產(chǎn)品體系架構
- 飲食基因與文化智慧樹知到期末考試答案2024年
- 廣東省課程思政示范高職院校申報書
- 墻面修復施工方案
- 徐工集團招聘測評題庫
- 初中語文九年級下冊《短詩五首-月夜》+教學課件
- 山東省煙臺市萊州市2023-2024學年五年級上學期期末考試數(shù)學試題
評論
0/150
提交評論