調(diào)試與優(yōu)化的理解與總結(jié)_第1頁
調(diào)試與優(yōu)化的理解與總結(jié)_第2頁
調(diào)試與優(yōu)化的理解與總結(jié)_第3頁
調(diào)試與優(yōu)化的理解與總結(jié)_第4頁
調(diào)試與優(yōu)化的理解與總結(jié)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2014-2015調(diào)試與優(yōu)化期末大作業(yè)對調(diào)試與優(yōu)化的理解與認(rèn)識學(xué)院:軟件學(xué)院專業(yè):軟件工程班級:13移動一班姓名:小捕快指導(dǎo)老師:許豪目錄一、調(diào)試與優(yōu)化的概念31、對調(diào)試的概念32、優(yōu)化的概念3二、調(diào)試與優(yōu)化的原則31、調(diào)試的原則32、優(yōu)化的原則3三、優(yōu)化的具體方法41確定浮點(diǎn)型變量和表達(dá)式是float型42使用32位的數(shù)據(jù)類型43明智使用有符號整型變量44 while vs. for55使用數(shù)組型代替指針型56充分分解小的循環(huán)58 switch的用法59所有函數(shù)都應(yīng)該有原型定義510 盡可能使用常量(const)611提升循環(huán)的性能613考慮動態(tài)內(nèi)存分配614使用顯式的并行代碼615提出公共

2、子表達(dá)式6四、調(diào)試的步驟71、靜態(tài)調(diào)試72、動態(tài)調(diào)試7(1) 觀察程序的運(yùn)行情況7(2) 設(shè)置斷點(diǎn)8(3) 設(shè)置監(jiān)視8五、調(diào)試心得8六、參考文獻(xiàn)91、嵌入式軟件調(diào)試技術(shù)92、嵌入式linux內(nèi)存使用與性能優(yōu)化9、調(diào)試與優(yōu)化的概念1、對調(diào)試的概念程序調(diào)試,是將編制的程序投入實(shí)際運(yùn)行前,用手工或編譯程序等方法進(jìn)行測試,修正 語法錯誤和邏輯錯誤的過程。這是保證汁算機(jī)信息系統(tǒng)正確性的必不可少的步驟。編完計(jì)算 機(jī)程序,必須送入計(jì)算機(jī)中測試。2、優(yōu)化的概念所謂代碼優(yōu)化是指對程序代碼進(jìn)行等價(jià)(指不改變程序的運(yùn)行結(jié)果)變換。程序代碼可 以是中間代碼(如四元式代碼),也可以是目標(biāo)代碼。等價(jià)的含義是使得變換后的代

3、碼運(yùn)行 結(jié)果與變換前代碼運(yùn)行結(jié)果相同。優(yōu)化的含義是最終生成的目標(biāo)代碼短(運(yùn)行時(shí)間更短、占 用空間更?。?,時(shí)空效率優(yōu)化。原則上,優(yōu)化可以在編譯的各個階段進(jìn)行,但最主要的一類 是對中間代碼進(jìn)行優(yōu)化,這類優(yōu)化不依賴于具體的計(jì)算機(jī)。在不改變程序運(yùn)行效果的前提下,對被編譯的程序進(jìn)行等價(jià)變換,使z能生成更加高效 的目標(biāo)代碼。八調(diào)試與優(yōu)化的原則1、調(diào)試的原則改進(jìn)、提高程序途徑:(1)改進(jìn)算法;(2)在源程序級上等價(jià)變換;(3)充分利用系統(tǒng)提供的程序庫;(4)編譯時(shí)優(yōu)化等。2、優(yōu)化的原則(1)用頭腦去分析思考與錯誤征兆有關(guān)的信息。(2)避開死胡同。(3)只把調(diào)試工具當(dāng)做手段。利用調(diào)試工具,可以幫助思考,但不能

4、代替思考,因?yàn)?調(diào)試工具給的是一種無規(guī)律的調(diào)試方法。(4)避免用試探法,最多只能把它當(dāng)做最后手段。(5)再出現(xiàn)錯誤的地方,可能述有別的錯誤。(6)修改錯誤的一個常見失誤是只修改了這個錯誤的征兆或這個錯誤的表現(xiàn),而沒有 修改錯誤本身。如果提出的修改不能解釋與這個錯誤有關(guān)的全部線索,那就表明只修改了錯 誤的一部分。(7)注意修正一個錯誤的同時(shí)可能會引入新的錯誤。(8)修改錯誤的過程將迫使人們暫時(shí)回到程序設(shè)計(jì)階段。修改錯誤也是程序設(shè)計(jì)的一 種形式。(9)修改源代碼程序,不要改變目標(biāo)代碼。三、優(yōu)化的具體方法1確定浮點(diǎn)型變量和表達(dá)式是float型為了讓編譯器產(chǎn)生更好的代碼(比如說產(chǎn)生3dnow!或sse

5、指令的代碼),必須確定浮 點(diǎn)型變量和表達(dá)式是float型的。要特別注意的是,以“f或f為后綴(比如:3.14f) 的浮點(diǎn)常量才是float型,否則默認(rèn)是double型。為了避免float型參數(shù)自動轉(zhuǎn)化為 double,請?jiān)诤瘮?shù)聲明時(shí)使用floato2使用32位的數(shù)據(jù)類型編譯器有很多種,但它們都包含的典型的32位類型是:int, signed, signed int, unsigned, unsigned int, long, signed long, long int, signed long int, unsigned long, unsigned long into盡量使用32位的數(shù)據(jù)類型

6、,因?yàn)樗鼈儽?6位的數(shù)據(jù)甚至8位的數(shù)據(jù)更 有效率。3明智使用有符號整型變量在很多情況下,你需要考慮整型變量是有符號還是無符號類型的。比如,保存一個人的 體重?cái)?shù)據(jù)時(shí)不可能出現(xiàn)負(fù)數(shù),所以不需要使用有符號類型。但是,如果是要保存溫度數(shù)據(jù), 就必須使用到有符號的變量。在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運(yùn)算比較 快;但在一些情況下卻相反。比如:整型到浮點(diǎn)轉(zhuǎn)化時(shí),使用大于16位的有符號整型比較快。因?yàn)閤86構(gòu)架中提供 了從有符號整型轉(zhuǎn)化到浮點(diǎn)型的指令,但沒有提供從無符號整型轉(zhuǎn)化到浮點(diǎn)的指令。看看編 譯器產(chǎn)生的匯編代碼:在整數(shù)運(yùn)算中計(jì)算商和余數(shù)時(shí),使用無符號類型比較快。以下

7、這段典型的代碼是編譯器 產(chǎn)生的32位整型數(shù)除以4的代碼:4 while vs. for在編程中,我們常常需要用到無限循環(huán),常用的兩種方法是while (1)和for(;)0這兩種方法效果完全一樣,但那一種更好呢?for(;)指令少,不占用寄存器,而且沒有判斷跳轉(zhuǎn),比while (1)好。5使用數(shù)組型代替指針型使用指針會使編譯器很難優(yōu)化它。因?yàn)槿狈τ行У闹羔槾a優(yōu)化的方法,編譯器總是假 設(shè)指針可以訪問內(nèi)存的任意地方,包括分配給其他變量的儲存空間。所以為了編譯器產(chǎn)生優(yōu) 化得更好的代碼,要避免在不必要的地方使用指針。一個典型的例子是訪問存放在數(shù)組中的 數(shù)據(jù)。c+允許使用操作符或指針來訪問數(shù)組,使用數(shù)

8、組型代碼會讓優(yōu)化器減少產(chǎn)生不 安全代碼的可能性。比如,x0和刈2不可能是同一個內(nèi)存地址,但*p和*q可能。強(qiáng) 烈建議使用數(shù)組型,因?yàn)檫@樣可能會有意料之外的性能提升。6充分分解小的循環(huán)要充分利用cpu的指令緩存,就要充分分解小的循環(huán)。特別是當(dāng)循環(huán)體木身很小的時(shí) 候,分解循環(huán)可以提高性能。btw:很多編譯器并不能白動分解循環(huán)。8 switch的用法switch對能轉(zhuǎn)化成多種不同算法的代碼。其中最常見的是跳轉(zhuǎn)表和比較鏈/樹。推薦對 case的值依照發(fā)生的可能性進(jìn)行排序,把最有可能的放在第一個,當(dāng)switch用比較鏈的方 式轉(zhuǎn)化時(shí),這樣可以提高性能。此外,在case中推薦使用小的連續(xù)的整數(shù),因?yàn)樵谶@種

9、情 況下,所有的編譯器都可以把switch轉(zhuǎn)化成跳轉(zhuǎn)表。9所有函數(shù)都應(yīng)該有原型定義 一般來說,所有函數(shù)都應(yīng)該有原型定義。原型定義可以傳達(dá)給編譯器更多的可能用于優(yōu)化的 信息。10盡可能使用常量(const)盡可能使用常量(const)o c+標(biāo)準(zhǔn)規(guī)定,如果一個const聲明的對象的地址不被獲取, 允許編譯器不對它分配儲存空間。這樣可以使代碼更有效率,而且可以生成更好的代碼。11提升循環(huán)的性能要提升循環(huán)的性能,減少多余的常量計(jì)算非常有用(比如,不隨循環(huán)變化的計(jì)算)。 如果己經(jīng)知道if()的值,這樣可以避免重復(fù)計(jì)算。12把木地函數(shù)聲明為靜態(tài)的(static)如果一個函數(shù)在實(shí)現(xiàn)它的文件外未被使用的話,

10、把它聲明為靜態(tài)的(static)以強(qiáng)制使用內(nèi) 部連接。否則,默認(rèn)的情況下會把函數(shù)定義為外部連接。這樣可能會影響某些編譯器的優(yōu)化 比如,自動內(nèi)聯(lián)。13考慮動態(tài)內(nèi)存分配動態(tài)內(nèi)存分趾(c+中的“new")可能總是為長的基本類型(四字對齊)返回一個已經(jīng) 對齊的指針。14使用顯式的并行代碼盡可能把長的有依賴的代碼鏈分解成兒個可以在流水線執(zhí)行單元屮并行執(zhí)行的沒有依 賴的代碼鏈。因?yàn)楦↑c(diǎn)操作有很長的潛伏期,所以不管它被映射成x87或3dnow!指令, 這都很重要。很多高級語言,包括c+,并不對產(chǎn)生的浮點(diǎn)表達(dá)式重新排序,因?yàn)槟鞘且?個相當(dāng)復(fù)雜的過程。需要注意的是,重排序的代碼和原來的代碼在代數(shù)上一致

11、并不等價(jià)于計(jì) 算結(jié)果一致,因?yàn)楦↑c(diǎn)操作缺乏精確度。在一些情況下,這些優(yōu)化可能導(dǎo)致意料之外的結(jié)果。 幸運(yùn)的是,在大部分情況下,最后結(jié)果可能只有最不重要的位(即最低位)是錯誤的。浮點(diǎn) 加法的每一個階段占用一個時(shí)鐘周期,保證了最大的資源利用率。15提出公共子表達(dá)式在某些情況下,c+編譯器不能從浮點(diǎn)表達(dá)式中提出公共的子表達(dá)式,因?yàn)檫@意味著相 當(dāng)于對表達(dá)式重新排序。需要特別指出的是,編譯器在提取公共子表達(dá)式前不能按照代數(shù)的 等價(jià)關(guān)系重新安排表達(dá)式。這時(shí),程序員要手動地提出公共的子表達(dá)式四、調(diào)試的步驟1、靜態(tài)調(diào)試可以采用如下兩種方法:(1)輸出寄存器的內(nèi)容。在測試中出現(xiàn)問題,設(shè)法保留現(xiàn)場信息。把所有寄存器

12、和主 存中有關(guān)部分的內(nèi)容打印出來(通常以八進(jìn)制或十六進(jìn)制的形式打?。?,進(jìn)行分析研究。用 這種方法調(diào)試,輸出的是程序的靜止?fàn)顟B(tài)(程序在某一時(shí)刻的狀態(tài)),效率非常低,不得已 時(shí)才采用。(2)為取得關(guān)鍵變量的動態(tài)值,在程序中插入打印語句。這是取得動態(tài)信息的簡單方 法,并可檢驗(yàn)在某吋間后某個變量是否按預(yù)期要求發(fā)生了變化。此方法的缺點(diǎn)是可能輸出大 梁需要分析的信息,必須修改源程序才能插入打印語句,這可能改變關(guān)鍵的時(shí)序關(guān)系,引入 新的錯誤。2、動態(tài)調(diào)試通常利用程序語言提供的調(diào)試功能或?qū)iT的調(diào)試工具來分析程序的動態(tài)行為。一 般程序語言和工具提供的調(diào)試功能有檢查主存和寄存器;設(shè)置斷點(diǎn),即當(dāng)執(zhí)行到特定語句或 改

13、變特定變量的值時(shí),程序停止執(zhí)行,以便分析程序此時(shí)的狀態(tài)。程序優(yōu)化是指對解決同一問題的兒個不同的程序,進(jìn)行比較、修改、調(diào)整或重新編寫程 序,把一般程序變換為語句最少、占用內(nèi)存量少、處理速度最快、外部設(shè)備分時(shí)使用效率最 高的最優(yōu)程序;優(yōu)化是科學(xué)研究、工程技術(shù)和經(jīng)濟(jì)管理等領(lǐng)域的重要研究工具。它所研究的 問題是討論在眾多的方案中尋找最優(yōu)方案。例如,工程設(shè)計(jì)中怎樣選擇設(shè)計(jì)參數(shù),使設(shè)計(jì)方 案既滿足設(shè)計(jì)要求乂能降低成本;資源分配屮,怎樣分配有限資源,使分配方案既能滿足各 方面的基本要求,又能獲得好的經(jīng)濟(jì)效益;在人類活動的各個領(lǐng)域中,諸如此類,不勝枚舉。 優(yōu)化這一技術(shù),正是為這些問題的解決,提供理論基礎(chǔ)和求解

14、方法,它是一門應(yīng)用廣泛、實(shí) 用性很強(qiáng)的科學(xué)。優(yōu)化包括尋找最小值和最大值兩種情況。尋找函數(shù)f的最大值等價(jià)于一f 最小值尋優(yōu),所以兩種情況可歸結(jié)到一起研究。(1)觀察程序的運(yùn)行情況僅這項(xiàng)功能就使一個典型的調(diào)試程序具備了不可估量的價(jià)值。即使你花了幾個月的吋間 精心編寫了一個程序,你也不一定完全清楚這個程序每一步的運(yùn)行情況。如果程序員忘記了 某些if語句、函數(shù)調(diào)用或分支程序,可能會導(dǎo)致某些程序段被跳過或執(zhí)行,而這種結(jié)果并不 是程序員所期望的。不管怎樣,在程序的執(zhí)行過程中,尤其是當(dāng)程序有異常表現(xiàn)時(shí),如果程 序員能隨時(shí)查看當(dāng)前被執(zhí)行的是那兒行代碼,那么他就能很好地了解程序正在做什么以及錯 誤發(fā)生在什么地方

15、。設(shè)置斷點(diǎn)通過設(shè)置斷點(diǎn)可以使程序在執(zhí)行到某一點(diǎn)吋暫吋停住。當(dāng)你知道錯誤發(fā)生在程序的哪一部分 時(shí),這種方法是特別有用的。你可以把斷點(diǎn)設(shè)置在有問題的程序段的前面、中間或后面。當(dāng) 程序執(zhí)行到斷點(diǎn)時(shí),就會暫時(shí)停住,此時(shí)你可以檢查所有局部變量、參數(shù)和全局變量的值。 如杲一切正常,可以繼續(xù)執(zhí)行程序,直到遇到另一個斷點(diǎn),或者直到引起問題的原因暴露出 來。(3)設(shè)置監(jiān)視程序員可以通過調(diào)試程序監(jiān)視一個變量,即連續(xù)地監(jiān)視一個變量的值或內(nèi)容。如果你清 楚一個變量的取值范i韋i或有效內(nèi)容,那么通過這種方法就能很快地找出錯誤的原因。此外, 你可以讓調(diào)試程序替你監(jiān)視變量,并且在某個變量超出預(yù)先定義的取值范圍或某個條件滿足 吋使程序暫停執(zhí)行。如果你知道變量的所有行為,那么這么做是很方便的。好的調(diào)試程序通常還提供一些其它功能來簡化調(diào)試工作。然而,調(diào)試程序并不是唯一的調(diào)試工具,lint程序和編譯程序本身也能提供很有價(jià)值的 手段來分析程序的運(yùn)行情況。五、調(diào)試心得經(jīng)過自己一個學(xué)期的學(xué)習(xí),對于調(diào)試與優(yōu)化有了自己深刻的了解, 在

溫馨提示

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

評論

0/150

提交評論