• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      嵌入式軟件優(yōu)化的認(rèn)識與實踐

      2010-08-14 08:03:44張喜俊唐云凱
      關(guān)鍵詞:局部性編譯器程序員

      張喜俊,唐云凱

      (1.中國電子科技集團公司 第四十一研究所,青島266555; 2.西北核技術(shù)研究所)

      張喜俊(工程師),研究方向為測試測量儀器軟件。

      1 自動優(yōu)化

      C編譯器是嵌入式系統(tǒng)程序員的基本工具,正是它將程序員的思想和算法轉(zhuǎn)換成處理器可以執(zhí)行的機器碼。所有的C編譯器都能夠執(zhí)行各種類型的優(yōu)化。以gcc編譯器為例,除了常見的-O1、-O2、-O3優(yōu)化選項以外,還可以根據(jù)需要打開其他優(yōu)化開關(guān),它們的含義如表1所列。

      表1 gcc編譯器優(yōu)化選項含義

      在編碼過程中,程序員還應(yīng)該盡可能地為編譯器提供更多的信息,協(xié)助編譯器更好地進行優(yōu)化。程序員與編譯器主要通過C語言關(guān)鍵字進行交流。以C標(biāo)準(zhǔn)庫函數(shù)strcpy為例,它的原型為“char*strcpy(char*dst,const char*src);” ,而不是“char*strcpy(char*dst,char*src);”。雖然它們只是相差一個const關(guān)鍵字,但在編譯器看來卻相差甚遠(yuǎn)。如果使用const修飾src,表明src指向一個常量字符串,編譯器可直接從寄存器或者高速緩存中訪問它們,而不必每次都從存儲器中讀出它們的內(nèi)容。這樣不僅提高了執(zhí)行速度,且編譯器也可捕獲對src指向的字符串的修改,并提示程序員不應(yīng)該修改常量字符串。

      2 手動優(yōu)化

      由于現(xiàn)代編譯器已經(jīng)能夠出色地自動完成大多數(shù)優(yōu)化工作,因此切忌盲目手動優(yōu)化。在進行實際的優(yōu)化之前,可以借助代碼剖析工具進行代碼分析,找出關(guān)鍵代碼片段,然后再進行手動優(yōu)化。使用gcov或者gprof之類的剖析器,可以找出一些有關(guān)代碼的基本性能統(tǒng)計數(shù)據(jù),例如每行代碼的調(diào)用次數(shù)、代碼覆蓋率和各部分代碼耗費的CPU時間等。了解這些基本信息之后,就知道了應(yīng)該對哪些代碼進行優(yōu)化。

      2.1 計算密集型優(yōu)化

      計算密集型應(yīng)用指的是那些進行大量計算的應(yīng)用,特別是與數(shù)字信號處理相關(guān)的應(yīng)用。算法和數(shù)據(jù)結(jié)構(gòu)的選擇至關(guān)重要,它們應(yīng)該是優(yōu)化工作的重點。除了算法優(yōu)化,在編碼過程中程序員還應(yīng)該盡可能地對基本運算進行優(yōu)化。例如:

      ①如果b>0并且b×c不會飽和,那么可以使用乘法代替除法,將(a/b)>c替換為a>(c×b)。

      ②如果乘法運算中的乘數(shù)或者除法運算中的分母為2的倍數(shù),那么可以使用移位操作代替乘除法。

      ③加法要快于乘法,如可使用(a+a+a)替換a×3。

      2.2 以空間換效率

      以空間換效率,即以犧牲代碼尺寸為代價換取運行效率。常見的優(yōu)化策略包括循環(huán)展開、查找表、數(shù)組索引和內(nèi)聯(lián)函數(shù)等。

      編者注:有關(guān)循環(huán)展開、查找表等內(nèi)容的詳細(xì)介紹請見本刊網(wǎng)站www.mesnet.com.cn。

      2.3 減少存儲器訪問次數(shù)

      2.3.1盡可能少使用全局變量

      由于全局變量是全局可見的,可以在多個地方對其進行修改,因此編譯器不能在寄存器中緩存全局變量的值。這樣,讀或者寫全局全局變量時,都必須訪問存儲器以裝載或存儲它們;而且在訪問全局變量時,為了保證其完整性必須確保操作是原子的,這又會增加開銷。

      2.3.2減小函數(shù)參數(shù)傳遞的開銷

      以ARM處理器為例,如果函數(shù)只包含4個參數(shù)或更少,每個參數(shù)的大小為一個字或更小,那么可以通過寄存器R0~R3來傳遞所有的參數(shù)。相反,如果參數(shù)個數(shù)大于4,那么其他的參數(shù)只能通過位于片內(nèi) RAM或者速度更慢的SDRAM中的堆棧來傳遞,與寄存器相比,它們的訪問速度要慢很多。注意,在C++中非靜態(tài)成員總是有一個this指針參數(shù),一般通過寄存器R0傳遞,這樣只剩下R1~R3三個寄存器可以傳遞其他參數(shù)。

      如果某個函數(shù)參數(shù)為一個大型的結(jié)構(gòu)體,那么最好將其改為傳遞指向這個結(jié)構(gòu)體的指針。這是因為,C語言中的函數(shù)調(diào)用默認(rèn)情況下是傳值調(diào)用,編譯器會將結(jié)構(gòu)體復(fù)制到堆棧。如果傳遞一個結(jié)構(gòu)體指針,那么只需要復(fù)制這個4字節(jié)的指針到寄存器。

      2.3.3合理安排運行時代碼和數(shù)據(jù)的位置

      嵌入式系統(tǒng)中往往存在多種類型的存儲器(如片內(nèi)Flash、片內(nèi) SRAM 以及擴展的 SDRAM、Flash和EEPROM等),它們的訪問速度相差甚遠(yuǎn)。同時,應(yīng)用程序代碼不同部分的執(zhí)行頻率也相差很大。以ARM嵌入式系統(tǒng)為例,異常向量表和中斷處理器的執(zhí)行最為頻繁。為了獲得最佳性能,可以將它們復(fù)制到片內(nèi)SRAM中,然后執(zhí)行存儲器重映射將異常向量表定位到0地址。其他關(guān)鍵代碼片段也可以利用分散加載描述文件(用于RealView工具鏈,gnu工具鏈?zhǔn)褂?lds文件)通知鏈接器和加載器,將它們裝載到指定的存儲器地址。

      3 局部性原理

      優(yōu)秀的代碼傾向于展示良好的局部性,它包含兩個方面的含義:其一,傾向于在極短的時間間隔內(nèi),多次引用同一存儲器位置;其二,傾向于在極短的時間間隔內(nèi),引用當(dāng)前訪問的數(shù)據(jù)項附近的數(shù)據(jù)項。

      具有良好局部性的代碼之所以具有較高的運行效率,這是因為計算機的存儲器系統(tǒng)是一個具有不同容量、成本和訪問時間的存儲設(shè)備的層次結(jié)構(gòu)。嵌入式系統(tǒng)的存儲器層次結(jié)構(gòu)一般可以分為寄存器、高速緩存、主存和Flash,它們的訪問時間逐步上升。層次結(jié)構(gòu)中的每一層都緩存來自較低一層的數(shù)據(jù)對象,如果需要訪問的數(shù)據(jù)沒有位于高速緩存中(即緩存不命中),那么不得不耗費數(shù)十倍的時間從主存中獲得,極大地降低了運行效率。

      比較下面2種二維數(shù)組求和方法。由于C語言以行優(yōu)先順序存儲數(shù)組,因此行優(yōu)先累加方法的局部性要優(yōu)于列優(yōu)先累加方法。

      [1]Sloss Andrew N,Symes Dominic,Wright Chris.ARM嵌入式系統(tǒng)開發(fā):軟件設(shè)計與優(yōu)化[M].沈建華,譯.北京:北京航空航天大學(xué)出版社,2005.

      [2]Bryant Randal E,O'Hallaron David.深入理解計算機系統(tǒng)(修訂版)[M].龔奕利,雷迎春,譯.北京:中國電力出版社,2004.

      [3]M Richard.Using the GNU Compiler Collection:For GCC version 4.4.1[EB/OL].[2009-10].http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc.pdf.

      [4]Ghosh Koushik.Writing Efficient C andC Code Optimization[EB/OL].(2004-2-26)[2009-10].http://www.codeproject.com/KB/cpp/C_Code_Optimization.aspx.

      猜你喜歡
      局部性編譯器程序員
      基于MOLS 的最優(yōu)二元局部修復(fù)碼構(gòu)造*
      為了讓媽媽看懂地圖,一位“野生程序員”做了個小程序
      消費電子(2022年7期)2022-10-31 06:17:10
      怎樣成為一名優(yōu)秀程序員
      幼兒100(2020年29期)2020-10-21 06:17:58
      基于相異編譯器的安全計算機平臺交叉編譯環(huán)境設(shè)計
      基于彈性網(wǎng)和直方圖相交的非負(fù)局部稀疏編碼
      程序員之子
      意林(2017年24期)2018-01-02 22:49:14
      加班
      三月三(2016年6期)2016-06-21 10:25:33
      通用NC代碼編譯器的設(shè)計與實現(xiàn)
      程序局部性的量化分析
      計算機工程(2013年1期)2013-09-29 05:19:56
      編譯器無關(guān)性編碼在微控制器中的優(yōu)勢
      宜兴市| 罗山县| 凯里市| 章丘市| 鹤庆县| 彭山县| 万盛区| 京山县| 静海县| 东乌| 高密市| 稻城县| 广东省| 当雄县| 浏阳市| 定边县| 新邵县| 鹿泉市| 杂多县| 江达县| 延安市| 清河县| 阳朔县| 上饶市| 苏尼特右旗| 肥城市| 调兵山市| 库尔勒市| 彩票| 绍兴县| 天津市| 弥勒县| 芦山县| 常德市| 平乡县| 威远县| 万源市| 社旗县| 化隆| 治多县| 景宁|