亚洲免费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ì)
        亚洲熟妇一区无码| 国产一区二区三区视频在线观看| 人妻少妇精品专区性色anvn| 日本精品久久久久中文字幕 | 国产猛男猛女超爽免费av| 在线精品国产亚洲av麻豆 | 亚洲av综合av成人小说| 久久夜色精品国产噜噜亚洲av | 国产精品一区2区三区| 日韩乱码精品中文字幕不卡| 日本一级二级三级不卡| 中文字幕日韩欧美一区二区三区 | 国产精品伦人视频免费看| 亚洲一区二区三区高清视频| av黄色在线免费观看| 亚洲av无码乱码在线观看牲色| 少妇放荡的呻吟干柴烈火动漫 | 2021亚洲色中文字幕| 区二区三区亚洲精品无| 国产精品国三级国产a| 亚洲精品美女久久777777| 国产香蕉尹人在线观看视频| 久久精品爱国产免费久久| 琪琪av一区二区三区| 一区二区国产av网站| 97精品久久久久中文字幕| 国产看黄网站又黄又爽又色| 国产午夜精品久久久久| 在线亚洲日本一区二区| 老师开裆丝袜喷水视频| 变态 另类 欧美 大码 日韩| 91精品国产免费青青碰在线观看| 亚洲一区二区三区资源| 国内自拍情侣露脸高清在线| 97精品超碰一区二区三区| 精品国产AⅤ一区二区三区4区| 日韩精品极品视频在线观看蜜桃| 论理视频二区三区四区在线观看 | 一本一本久久a久久精品综合| 国产男女猛烈无遮挡免费视频网址 | 成视频年人黄网站免费视频|