




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、2014-2015調試與優(yōu)化期末大作業(yè)對調試與優(yōu)化的理解與認識學院:軟件學院專業(yè):軟件工程班級:13移動一班姓名:小捕快指導老師:許豪目錄一、調試與優(yōu)化的概念31、對調試的概念32、優(yōu)化的概念3二、調試與優(yōu)化的原則31、調試的原則32、優(yōu)化的原則3三、優(yōu)化的具體方法41確定浮點型變量和表達式是float型42使用32位的數(shù)據(jù)類型43明智使用有符號整型變量44 while vs. for55使用數(shù)組型代替指針型56充分分解小的循環(huán)58 switch的用法59所有函數(shù)都應該有原型定義510 盡可能使用常量(const)611提升循環(huán)的性能613考慮動態(tài)內(nèi)存分配614使用顯式的并行代碼615提出公共
2、子表達式6四、調試的步驟71、靜態(tài)調試72、動態(tài)調試7(1) 觀察程序的運行情況7(2) 設置斷點8(3) 設置監(jiān)視8五、調試心得8六、參考文獻91、嵌入式軟件調試技術92、嵌入式linux內(nèi)存使用與性能優(yōu)化9、調試與優(yōu)化的概念1、對調試的概念程序調試,是將編制的程序投入實際運行前,用手工或編譯程序等方法進行測試,修正 語法錯誤和邏輯錯誤的過程。這是保證汁算機信息系統(tǒng)正確性的必不可少的步驟。編完計算 機程序,必須送入計算機中測試。2、優(yōu)化的概念所謂代碼優(yōu)化是指對程序代碼進行等價(指不改變程序的運行結果)變換。程序代碼可 以是中間代碼(如四元式代碼),也可以是目標代碼。等價的含義是使得變換后的代
3、碼運行 結果與變換前代碼運行結果相同。優(yōu)化的含義是最終生成的目標代碼短(運行時間更短、占 用空間更小),時空效率優(yōu)化。原則上,優(yōu)化可以在編譯的各個階段進行,但最主要的一類 是對中間代碼進行優(yōu)化,這類優(yōu)化不依賴于具體的計算機。在不改變程序運行效果的前提下,對被編譯的程序進行等價變換,使z能生成更加高效 的目標代碼。八調試與優(yōu)化的原則1、調試的原則改進、提高程序途徑:(1)改進算法;(2)在源程序級上等價變換;(3)充分利用系統(tǒng)提供的程序庫;(4)編譯時優(yōu)化等。2、優(yōu)化的原則(1)用頭腦去分析思考與錯誤征兆有關的信息。(2)避開死胡同。(3)只把調試工具當做手段。利用調試工具,可以幫助思考,但不能
4、代替思考,因為 調試工具給的是一種無規(guī)律的調試方法。(4)避免用試探法,最多只能把它當做最后手段。(5)再出現(xiàn)錯誤的地方,可能述有別的錯誤。(6)修改錯誤的一個常見失誤是只修改了這個錯誤的征兆或這個錯誤的表現(xiàn),而沒有 修改錯誤本身。如果提出的修改不能解釋與這個錯誤有關的全部線索,那就表明只修改了錯 誤的一部分。(7)注意修正一個錯誤的同時可能會引入新的錯誤。(8)修改錯誤的過程將迫使人們暫時回到程序設計階段。修改錯誤也是程序設計的一 種形式。(9)修改源代碼程序,不要改變目標代碼。三、優(yōu)化的具體方法1確定浮點型變量和表達式是float型為了讓編譯器產(chǎn)生更好的代碼(比如說產(chǎn)生3dnow!或sse
5、指令的代碼),必須確定浮 點型變量和表達式是float型的。要特別注意的是,以“f或f為后綴(比如:3.14f) 的浮點常量才是float型,否則默認是double型。為了避免float型參數(shù)自動轉化為 double,請在函數(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、,因為它們比16位的數(shù)據(jù)甚至8位的數(shù)據(jù)更 有效率。3明智使用有符號整型變量在很多情況下,你需要考慮整型變量是有符號還是無符號類型的。比如,保存一個人的 體重數(shù)據(jù)時不可能出現(xiàn)負數(shù),所以不需要使用有符號類型。但是,如果是要保存溫度數(shù)據(jù), 就必須使用到有符號的變量。在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運算比較 快;但在一些情況下卻相反。比如:整型到浮點轉化時,使用大于16位的有符號整型比較快。因為x86構架中提供 了從有符號整型轉化到浮點型的指令,但沒有提供從無符號整型轉化到浮點的指令??纯淳?譯器產(chǎn)生的匯編代碼:在整數(shù)運算中計算商和余數(shù)時,使用無符號類型比較快。以下
7、這段典型的代碼是編譯器 產(chǎn)生的32位整型數(shù)除以4的代碼:4 while vs. for在編程中,我們常常需要用到無限循環(huán),常用的兩種方法是while (1)和for(;)0這兩種方法效果完全一樣,但那一種更好呢?for(;)指令少,不占用寄存器,而且沒有判斷跳轉,比while (1)好。5使用數(shù)組型代替指針型使用指針會使編譯器很難優(yōu)化它。因為缺乏有效的指針代碼優(yōu)化的方法,編譯器總是假 設指針可以訪問內(nèi)存的任意地方,包括分配給其他變量的儲存空間。所以為了編譯器產(chǎn)生優(yōu) 化得更好的代碼,要避免在不必要的地方使用指針。一個典型的例子是訪問存放在數(shù)組中的 數(shù)據(jù)。c+允許使用操作符或指針來訪問數(shù)組,使用數(shù)
8、組型代碼會讓優(yōu)化器減少產(chǎn)生不 安全代碼的可能性。比如,x0和刈2不可能是同一個內(nèi)存地址,但*p和*q可能。強 烈建議使用數(shù)組型,因為這樣可能會有意料之外的性能提升。6充分分解小的循環(huán)要充分利用cpu的指令緩存,就要充分分解小的循環(huán)。特別是當循環(huán)體木身很小的時 候,分解循環(huán)可以提高性能。btw:很多編譯器并不能白動分解循環(huán)。8 switch的用法switch對能轉化成多種不同算法的代碼。其中最常見的是跳轉表和比較鏈/樹。推薦對 case的值依照發(fā)生的可能性進行排序,把最有可能的放在第一個,當switch用比較鏈的方 式轉化時,這樣可以提高性能。此外,在case中推薦使用小的連續(xù)的整數(shù),因為在這種
9、情 況下,所有的編譯器都可以把switch轉化成跳轉表。9所有函數(shù)都應該有原型定義 一般來說,所有函數(shù)都應該有原型定義。原型定義可以傳達給編譯器更多的可能用于優(yōu)化的 信息。10盡可能使用常量(const)盡可能使用常量(const)o c+標準規(guī)定,如果一個const聲明的對象的地址不被獲取, 允許編譯器不對它分配儲存空間。這樣可以使代碼更有效率,而且可以生成更好的代碼。11提升循環(huán)的性能要提升循環(huán)的性能,減少多余的常量計算非常有用(比如,不隨循環(huán)變化的計算)。 如果己經(jīng)知道if()的值,這樣可以避免重復計算。12把木地函數(shù)聲明為靜態(tài)的(static)如果一個函數(shù)在實現(xiàn)它的文件外未被使用的話,
10、把它聲明為靜態(tài)的(static)以強制使用內(nèi) 部連接。否則,默認的情況下會把函數(shù)定義為外部連接。這樣可能會影響某些編譯器的優(yōu)化 比如,自動內(nèi)聯(lián)。13考慮動態(tài)內(nèi)存分配動態(tài)內(nèi)存分趾(c+中的“new")可能總是為長的基本類型(四字對齊)返回一個已經(jīng) 對齊的指針。14使用顯式的并行代碼盡可能把長的有依賴的代碼鏈分解成兒個可以在流水線執(zhí)行單元屮并行執(zhí)行的沒有依 賴的代碼鏈。因為浮點操作有很長的潛伏期,所以不管它被映射成x87或3dnow!指令, 這都很重要。很多高級語言,包括c+,并不對產(chǎn)生的浮點表達式重新排序,因為那是一 個相當復雜的過程。需要注意的是,重排序的代碼和原來的代碼在代數(shù)上一致
11、并不等價于計 算結果一致,因為浮點操作缺乏精確度。在一些情況下,這些優(yōu)化可能導致意料之外的結果。 幸運的是,在大部分情況下,最后結果可能只有最不重要的位(即最低位)是錯誤的。浮點 加法的每一個階段占用一個時鐘周期,保證了最大的資源利用率。15提出公共子表達式在某些情況下,c+編譯器不能從浮點表達式中提出公共的子表達式,因為這意味著相 當于對表達式重新排序。需要特別指出的是,編譯器在提取公共子表達式前不能按照代數(shù)的 等價關系重新安排表達式。這時,程序員要手動地提出公共的子表達式四、調試的步驟1、靜態(tài)調試可以采用如下兩種方法:(1)輸出寄存器的內(nèi)容。在測試中出現(xiàn)問題,設法保留現(xiàn)場信息。把所有寄存器
12、和主 存中有關部分的內(nèi)容打印出來(通常以八進制或十六進制的形式打?。?,進行分析研究。用 這種方法調試,輸出的是程序的靜止狀態(tài)(程序在某一時刻的狀態(tài)),效率非常低,不得已 時才采用。(2)為取得關鍵變量的動態(tài)值,在程序中插入打印語句。這是取得動態(tài)信息的簡單方 法,并可檢驗在某吋間后某個變量是否按預期要求發(fā)生了變化。此方法的缺點是可能輸出大 梁需要分析的信息,必須修改源程序才能插入打印語句,這可能改變關鍵的時序關系,引入 新的錯誤。2、動態(tài)調試通常利用程序語言提供的調試功能或專門的調試工具來分析程序的動態(tài)行為。一 般程序語言和工具提供的調試功能有檢查主存和寄存器;設置斷點,即當執(zhí)行到特定語句或 改
13、變特定變量的值時,程序停止執(zhí)行,以便分析程序此時的狀態(tài)。程序優(yōu)化是指對解決同一問題的兒個不同的程序,進行比較、修改、調整或重新編寫程 序,把一般程序變換為語句最少、占用內(nèi)存量少、處理速度最快、外部設備分時使用效率最 高的最優(yōu)程序;優(yōu)化是科學研究、工程技術和經(jīng)濟管理等領域的重要研究工具。它所研究的 問題是討論在眾多的方案中尋找最優(yōu)方案。例如,工程設計中怎樣選擇設計參數(shù),使設計方 案既滿足設計要求乂能降低成本;資源分配屮,怎樣分配有限資源,使分配方案既能滿足各 方面的基本要求,又能獲得好的經(jīng)濟效益;在人類活動的各個領域中,諸如此類,不勝枚舉。 優(yōu)化這一技術,正是為這些問題的解決,提供理論基礎和求解
14、方法,它是一門應用廣泛、實 用性很強的科學。優(yōu)化包括尋找最小值和最大值兩種情況。尋找函數(shù)f的最大值等價于一f 最小值尋優(yōu),所以兩種情況可歸結到一起研究。(1)觀察程序的運行情況僅這項功能就使一個典型的調試程序具備了不可估量的價值。即使你花了幾個月的吋間 精心編寫了一個程序,你也不一定完全清楚這個程序每一步的運行情況。如果程序員忘記了 某些if語句、函數(shù)調用或分支程序,可能會導致某些程序段被跳過或執(zhí)行,而這種結果并不 是程序員所期望的。不管怎樣,在程序的執(zhí)行過程中,尤其是當程序有異常表現(xiàn)時,如果程 序員能隨時查看當前被執(zhí)行的是那兒行代碼,那么他就能很好地了解程序正在做什么以及錯 誤發(fā)生在什么地方
15、。設置斷點通過設置斷點可以使程序在執(zhí)行到某一點吋暫吋停住。當你知道錯誤發(fā)生在程序的哪一部分 時,這種方法是特別有用的。你可以把斷點設置在有問題的程序段的前面、中間或后面。當 程序執(zhí)行到斷點時,就會暫時停住,此時你可以檢查所有局部變量、參數(shù)和全局變量的值。 如杲一切正常,可以繼續(xù)執(zhí)行程序,直到遇到另一個斷點,或者直到引起問題的原因暴露出 來。(3)設置監(jiān)視程序員可以通過調試程序監(jiān)視一個變量,即連續(xù)地監(jiān)視一個變量的值或內(nèi)容。如果你清 楚一個變量的取值范i韋i或有效內(nèi)容,那么通過這種方法就能很快地找出錯誤的原因。此外, 你可以讓調試程序替你監(jiān)視變量,并且在某個變量超出預先定義的取值范圍或某個條件滿足 吋使程序暫停執(zhí)行。如果你知道變量的所有行為,那么這么做是很方便的。好的調試程序通常還提供一些其它功能來簡化調試工作。然而,調試程序并不是唯一的調試工具,lint程序和編譯程序本身也能提供很有價值的 手段來分析程序的運行情況。五、調試心得經(jīng)過自己一個學期的學習,對于調試與優(yōu)化有了自己深刻的了解, 在
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北省安全員-C證考試題庫
- 2025湖南省安全員《C證》考試題庫及答案
- 南京審計大學《數(shù)學學科與教學指導實踐》2023-2024學年第二學期期末試卷
- 海南醫(yī)學院《數(shù)字時代品牌傳播》2023-2024學年第二學期期末試卷
- 哈爾濱城市職業(yè)學院《會計電算化實訓》2023-2024學年第二學期期末試卷
- 做賬實操-保險行業(yè)的賬務處理示例
- 2025青海省建筑安全員A證考試題庫附答案
- 南京城市職業(yè)學院《主任工作技能》2023-2024學年第二學期期末試卷
- 湖北國土資源職業(yè)學院《精神分析理論與技術》2023-2024學年第二學期期末試卷
- 徐州工業(yè)職業(yè)技術學院《三維建模與貼圖》2023-2024學年第二學期期末試卷
- 礦山機械傷害安全培訓
- 鄭州2025年河南鄭州市公安機關招聘輔警1200人筆試歷年參考題庫附帶答案詳解
- 2025年語文高考復習計劃解析
- 微電網(wǎng)運行與控制策略-深度研究
- 中職高教版(2023)語文職業(yè)模塊-第五單元:走近大國工匠(一)展示國家工程-了解工匠貢獻【課件】
- 物業(yè)管理車輛出入管理制度
- 家庭康復服務的商業(yè)價值與發(fā)展趨勢
- 2025年施工項目部《春節(jié)節(jié)后復工復產(chǎn)》工作實施方案 (3份)-75
- 礦山安全生產(chǎn)工作總結
- 小學教師培訓課件:做有品位的小學數(shù)學教師
- U8UAP開發(fā)手冊資料
評論
0/150
提交評論