




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2014-2015調試與優化期末大作業對調試與優化的理解與認識學院:軟件學院專業:軟件工程班級:13移動一班姓名:小捕快指導老師:許豪目錄一、調試與優化的概念31、對調試的概念32、優化的概念3二、調試與優化的原則31、調試的原則32、優化的原則3三、優化的具體方法41確定浮點型變量和表達式是float型42使用32位的數據類型43明智使用有符號整型變量44 while vs. for55使用數組型代替指針型56充分分解小的循環58 switch的用法59所有函數都應該有原型定義510 盡可能使用常量(const)611提升循環的性能613考慮動態內存分配614使用顯式的并行代碼615提出公共
2、子表達式6四、調試的步驟71、靜態調試72、動態調試7(1) 觀察程序的運行情況7(2) 設置斷點8(3) 設置監視8五、調試心得8六、參考文獻91、嵌入式軟件調試技術92、嵌入式linux內存使用與性能優化9、調試與優化的概念1、對調試的概念程序調試,是將編制的程序投入實際運行前,用手工或編譯程序等方法進行測試,修正 語法錯誤和邏輯錯誤的過程。這是保證汁算機信息系統正確性的必不可少的步驟。編完計算 機程序,必須送入計算機中測試。2、優化的概念所謂代碼優化是指對程序代碼進行等價(指不改變程序的運行結果)變換。程序代碼可 以是中間代碼(如四元式代碼),也可以是目標代碼。等價的含義是使得變換后的代
3、碼運行 結果與變換前代碼運行結果相同。優化的含義是最終生成的目標代碼短(運行時間更短、占 用空間更小),時空效率優化。原則上,優化可以在編譯的各個階段進行,但最主要的一類 是對中間代碼進行優化,這類優化不依賴于具體的計算機。在不改變程序運行效果的前提下,對被編譯的程序進行等價變換,使z能生成更加高效 的目標代碼。八調試與優化的原則1、調試的原則改進、提高程序途徑:(1)改進算法;(2)在源程序級上等價變換;(3)充分利用系統提供的程序庫;(4)編譯時優化等。2、優化的原則(1)用頭腦去分析思考與錯誤征兆有關的信息。(2)避開死胡同。(3)只把調試工具當做手段。利用調試工具,可以幫助思考,但不能
4、代替思考,因為 調試工具給的是一種無規律的調試方法。(4)避免用試探法,最多只能把它當做最后手段。(5)再出現錯誤的地方,可能述有別的錯誤。(6)修改錯誤的一個常見失誤是只修改了這個錯誤的征兆或這個錯誤的表現,而沒有 修改錯誤本身。如果提出的修改不能解釋與這個錯誤有關的全部線索,那就表明只修改了錯 誤的一部分。(7)注意修正一個錯誤的同時可能會引入新的錯誤。(8)修改錯誤的過程將迫使人們暫時回到程序設計階段。修改錯誤也是程序設計的一 種形式。(9)修改源代碼程序,不要改變目標代碼。三、優化的具體方法1確定浮點型變量和表達式是float型為了讓編譯器產生更好的代碼(比如說產生3dnow!或sse
5、指令的代碼),必須確定浮 點型變量和表達式是float型的。要特別注意的是,以“f或f為后綴(比如:3.14f) 的浮點常量才是float型,否則默認是double型。為了避免float型參數自動轉化為 double,請在函數聲明時使用floato2使用32位的數據類型編譯器有很多種,但它們都包含的典型的32位類型是:int, signed, signed int, unsigned, unsigned int, long, signed long, long int, signed long int, unsigned long, unsigned long into盡量使用32位的數據類型
6、,因為它們比16位的數據甚至8位的數據更 有效率。3明智使用有符號整型變量在很多情況下,你需要考慮整型變量是有符號還是無符號類型的。比如,保存一個人的 體重數據時不可能出現負數,所以不需要使用有符號類型。但是,如果是要保存溫度數據, 就必須使用到有符號的變量。在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運算比較 快;但在一些情況下卻相反。比如:整型到浮點轉化時,使用大于16位的有符號整型比較快。因為x86構架中提供 了從有符號整型轉化到浮點型的指令,但沒有提供從無符號整型轉化到浮點的指令。看看編 譯器產生的匯編代碼:在整數運算中計算商和余數時,使用無符號類型比較快。以下
7、這段典型的代碼是編譯器 產生的32位整型數除以4的代碼:4 while vs. for在編程中,我們常常需要用到無限循環,常用的兩種方法是while (1)和for(;)0這兩種方法效果完全一樣,但那一種更好呢?for(;)指令少,不占用寄存器,而且沒有判斷跳轉,比while (1)好。5使用數組型代替指針型使用指針會使編譯器很難優化它。因為缺乏有效的指針代碼優化的方法,編譯器總是假 設指針可以訪問內存的任意地方,包括分配給其他變量的儲存空間。所以為了編譯器產生優 化得更好的代碼,要避免在不必要的地方使用指針。一個典型的例子是訪問存放在數組中的 數據。c+允許使用操作符或指針來訪問數組,使用數
8、組型代碼會讓優化器減少產生不 安全代碼的可能性。比如,x0和刈2不可能是同一個內存地址,但*p和*q可能。強 烈建議使用數組型,因為這樣可能會有意料之外的性能提升。6充分分解小的循環要充分利用cpu的指令緩存,就要充分分解小的循環。特別是當循環體木身很小的時 候,分解循環可以提高性能。btw:很多編譯器并不能白動分解循環。8 switch的用法switch對能轉化成多種不同算法的代碼。其中最常見的是跳轉表和比較鏈/樹。推薦對 case的值依照發生的可能性進行排序,把最有可能的放在第一個,當switch用比較鏈的方 式轉化時,這樣可以提高性能。此外,在case中推薦使用小的連續的整數,因為在這種
9、情 況下,所有的編譯器都可以把switch轉化成跳轉表。9所有函數都應該有原型定義 一般來說,所有函數都應該有原型定義。原型定義可以傳達給編譯器更多的可能用于優化的 信息。10盡可能使用常量(const)盡可能使用常量(const)o c+標準規定,如果一個const聲明的對象的地址不被獲取, 允許編譯器不對它分配儲存空間。這樣可以使代碼更有效率,而且可以生成更好的代碼。11提升循環的性能要提升循環的性能,減少多余的常量計算非常有用(比如,不隨循環變化的計算)。 如果己經知道if()的值,這樣可以避免重復計算。12把木地函數聲明為靜態的(static)如果一個函數在實現它的文件外未被使用的話,
10、把它聲明為靜態的(static)以強制使用內 部連接。否則,默認的情況下會把函數定義為外部連接。這樣可能會影響某些編譯器的優化 比如,自動內聯。13考慮動態內存分配動態內存分趾(c+中的“new")可能總是為長的基本類型(四字對齊)返回一個已經 對齊的指針。14使用顯式的并行代碼盡可能把長的有依賴的代碼鏈分解成兒個可以在流水線執行單元屮并行執行的沒有依 賴的代碼鏈。因為浮點操作有很長的潛伏期,所以不管它被映射成x87或3dnow!指令, 這都很重要。很多高級語言,包括c+,并不對產生的浮點表達式重新排序,因為那是一 個相當復雜的過程。需要注意的是,重排序的代碼和原來的代碼在代數上一致
11、并不等價于計 算結果一致,因為浮點操作缺乏精確度。在一些情況下,這些優化可能導致意料之外的結果。 幸運的是,在大部分情況下,最后結果可能只有最不重要的位(即最低位)是錯誤的。浮點 加法的每一個階段占用一個時鐘周期,保證了最大的資源利用率。15提出公共子表達式在某些情況下,c+編譯器不能從浮點表達式中提出公共的子表達式,因為這意味著相 當于對表達式重新排序。需要特別指出的是,編譯器在提取公共子表達式前不能按照代數的 等價關系重新安排表達式。這時,程序員要手動地提出公共的子表達式四、調試的步驟1、靜態調試可以采用如下兩種方法:(1)輸出寄存器的內容。在測試中出現問題,設法保留現場信息。把所有寄存器
12、和主 存中有關部分的內容打印出來(通常以八進制或十六進制的形式打印),進行分析研究。用 這種方法調試,輸出的是程序的靜止狀態(程序在某一時刻的狀態),效率非常低,不得已 時才采用。(2)為取得關鍵變量的動態值,在程序中插入打印語句。這是取得動態信息的簡單方 法,并可檢驗在某吋間后某個變量是否按預期要求發生了變化。此方法的缺點是可能輸出大 梁需要分析的信息,必須修改源程序才能插入打印語句,這可能改變關鍵的時序關系,引入 新的錯誤。2、動態調試通常利用程序語言提供的調試功能或專門的調試工具來分析程序的動態行為。一 般程序語言和工具提供的調試功能有檢查主存和寄存器;設置斷點,即當執行到特定語句或 改
13、變特定變量的值時,程序停止執行,以便分析程序此時的狀態。程序優化是指對解決同一問題的兒個不同的程序,進行比較、修改、調整或重新編寫程 序,把一般程序變換為語句最少、占用內存量少、處理速度最快、外部設備分時使用效率最 高的最優程序;優化是科學研究、工程技術和經濟管理等領域的重要研究工具。它所研究的 問題是討論在眾多的方案中尋找最優方案。例如,工程設計中怎樣選擇設計參數,使設計方 案既滿足設計要求乂能降低成本;資源分配屮,怎樣分配有限資源,使分配方案既能滿足各 方面的基本要求,又能獲得好的經濟效益;在人類活動的各個領域中,諸如此類,不勝枚舉。 優化這一技術,正是為這些問題的解決,提供理論基礎和求解
14、方法,它是一門應用廣泛、實 用性很強的科學。優化包括尋找最小值和最大值兩種情況。尋找函數f的最大值等價于一f 最小值尋優,所以兩種情況可歸結到一起研究。(1)觀察程序的運行情況僅這項功能就使一個典型的調試程序具備了不可估量的價值。即使你花了幾個月的吋間 精心編寫了一個程序,你也不一定完全清楚這個程序每一步的運行情況。如果程序員忘記了 某些if語句、函數調用或分支程序,可能會導致某些程序段被跳過或執行,而這種結果并不 是程序員所期望的。不管怎樣,在程序的執行過程中,尤其是當程序有異常表現時,如果程 序員能隨時查看當前被執行的是那兒行代碼,那么他就能很好地了解程序正在做什么以及錯 誤發生在什么地方
15、。設置斷點通過設置斷點可以使程序在執行到某一點吋暫吋停住。當你知道錯誤發生在程序的哪一部分 時,這種方法是特別有用的。你可以把斷點設置在有問題的程序段的前面、中間或后面。當 程序執行到斷點時,就會暫時停住,此時你可以檢查所有局部變量、參數和全局變量的值。 如杲一切正常,可以繼續執行程序,直到遇到另一個斷點,或者直到引起問題的原因暴露出 來。(3)設置監視程序員可以通過調試程序監視一個變量,即連續地監視一個變量的值或內容。如果你清 楚一個變量的取值范i韋i或有效內容,那么通過這種方法就能很快地找出錯誤的原因。此外, 你可以讓調試程序替你監視變量,并且在某個變量超出預先定義的取值范圍或某個條件滿足 吋使程序暫停執行。如果你知道變量的所有行為,那么這么做是很方便的。好的調試程序通常還提供一些其它功能來簡化調試工作。然而,調試程序并不是唯一的調試工具,lint程序和編譯程序本身也能提供很有價值的 手段來分析程序的運行情況。五、調試心得經過自己一個學期的學習,對于調試與優化有了自己深刻的了解, 在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 應急醫療保障課件
- 義務教育辦學標準
- 企業財務兼職人員合作協議
- 餐飲業餐飲服務流程優化與改進顧問合同
- 城市公共交通停車場經營權轉讓協議
- 汽車租賃場銷售代理合作協議范本
- 餐飲店面租賃及特色餐飲項目合作協議
- 場監督管理局舉報投訴處理與責任認定與落實合同
- 車位租賃合同含停車管理協議
- 拆墻工程環保驗收協議
- 車位開盤定價方案
- 2024年中國三回程烘干機市場調查研究報告
- 國開(北京)2024年秋《財務案例分析》形考作業答案
- DB52T 1512-2020 水利水電工程隧洞施工超前地質預報技術規程
- GB/T 44831-2024皮膚芯片通用技術要求
- 精神科火災演練腳本
- 汽輪發電機組設備運行記錄日報表(正面) A2
- 15J403-1-樓梯欄桿欄板(一)
- 2024年婦幼健康“三基”培訓考試復習題庫-下(多選、判斷題)
- 子癇的搶救和護理
- 2025年高考政治一輪復習:統編版必修3《政治與法治》必背考點知識講義
評論
0/150
提交評論