亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        張喜俊,唐云凱

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

        張喜俊(工程師),研究方向?yàn)闇y(cè)試測(cè)量?jī)x器軟件。

        1 自動(dòng)優(yōu)化

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

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

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

        2 手動(dòng)優(yōu)化

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

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

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

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

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

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

        2.2 以空間換效率

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

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

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

        2.3.1盡可能少使用全局變量

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

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

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

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

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

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

        3 局部性原理

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

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

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

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

        [2]Bryant Randal E,O'Hallaron David.深入理解計(jì)算機(jī)系統(tǒng)(修訂版)[M].龔奕利,雷迎春,譯.北京:中國(guó)電力出版社,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)造*
        為了讓媽媽看懂地圖,一位“野生程序員”做了個(gè)小程序
        怎樣成為一名優(yōu)秀程序員
        幼兒100(2020年29期)2020-10-21 06:17:58
        基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
        基于彈性網(wǎng)和直方圖相交的非負(fù)局部稀疏編碼
        程序員之子
        意林(2017年24期)2018-01-02 22:49:14
        加班
        三月三(2016年6期)2016-06-21 10:25:33
        通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
        程序局部性的量化分析
        編譯器無關(guān)性編碼在微控制器中的優(yōu)勢(shì)
        国产真实二区一区在线亚洲| 精品国模一区二区三区| 欧美精品一区二区性色a+v| 国产农村妇女精品一二区| 国产女主播喷水视频在线观看| 亚洲成人欧美| 亚洲国产综合专区在线电影| 色偷偷亚洲精品一区二区| 久久久亚洲av波多野结衣| 日韩a无v码在线播放| 中文字幕不卡在线播放| 久久精品国产亚洲av调教| 久久久亚洲av午夜精品| 日本一区二区三区高清在线视频| 美女把尿囗扒开让男人添| 午夜婷婷国产麻豆精品| 亚洲天堂av大片暖暖| 男女男精品视频网站免费看| 欧美 丝袜 自拍 制服 另类| 国产主播在线 | 中文| 91麻豆精品久久久影院| 亚洲精品一区久久久久一品av | 凌辱人妻中文字幕一区| 亚洲综合区图片小说区| 日本少妇被爽到高潮的免费| 国产丝袜美腿一区二区三区| 久久久久国色av免费观看性色| 丰满少妇愉情中文字幕18禁片| 青青草99久久精品国产综合| 白白色发布免费手机在线视频观看| 亚洲av片在线观看| 久久综合给日咪咪精品欧一区二区三| 国产一区二区三区乱码在线| 亚洲人成网站在线播放2019| 日本高清aⅴ毛片免费| 亚洲夫妻性生活视频网站| 国产精品毛片毛片av一区二区| 亚洲乱码av中文一区二区| 性一交一乱一透一a级| 欧美性爱一区二区三区无a| 中文字幕亚洲视频三区|