• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tbwshc

            tbw

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            事情應(yīng)該盡可能簡化,而不只是簡單一點(diǎn)點(diǎn),一愛因斯坦

            雖然使軟件正確的工作好像應(yīng)該是一個工程合乎邏輯的最后一個步驟,但是在嵌入式的系統(tǒng)的開發(fā)中,情況并不總是這樣的。出于對低價系列產(chǎn)品的需要,硬件的設(shè)計者需要提供剛好足夠的存儲器和完成工作的處理能力。當(dāng)然,在工程的軟件開發(fā)階段,使程序正確的工作是很重要的。為此,通常需要一個或者更多的開發(fā)電路板,有的有附加的存貯器,有的有更快的處理器,有的兩者都有。這些電路板就是用來使軟件正確工作的。而工程的最后階段則變成了對代碼進(jìn)行優(yōu)化。最后一步的目標(biāo)是使得工作程序在一個廉價的硬件平臺上運(yùn)行。

            提高代碼的效率
            所有現(xiàn)代的 C 和C++編譯器都提供了一定程度上的代碼優(yōu)化。然而,大部分由編譯器執(zhí)行的優(yōu)化技術(shù)僅涉及執(zhí)行速度和代碼大小的一個平衡。你的程序能夠變得更快或者更小,但是不可能又變快又變小。事實(shí)上,在其中一個方面的提高就會對另一方面產(chǎn)生負(fù)面的影響。哪一方面的提高對于程序更加的重要是由程序員來決定。知道這一點(diǎn)后,無論什么時候遇到速度與大小的矛盾,編譯器的優(yōu)化階段就會作出合適的選擇。

            因?yàn)槟悴豢赡茏尵幾g器為你同時做兩種類型的優(yōu)化,我建議你讓它盡其所能的減少程序的大小。執(zhí)行的速度通常只對于某些有時間限制或者是頻繁執(zhí)行的代碼段是重要的。而且你可以通過手工的辦法做很多事以提高這些代碼段的效率。然而,手工改變代碼大小是一件很難的事情,而且編譯器處于一個更有利的位置,使得它可以在你所有的軟件模塊之間進(jìn)行這種改變。

            直到你的程序工作起來,你可能已經(jīng)知道或者是非常的清楚,哪一個子程序或者模塊對于整體代碼效率是最關(guān)鍵的。中斷服務(wù)例程、高優(yōu)先級的任務(wù)、有實(shí)時限制的計算、計算密集型或者頻繁調(diào)用的函數(shù)都是候選對象。有一個叫作profiler 的工具,它包括在一些軟件開發(fā)工具組中,這個工具可以用來把你的視線集中到那些程序花費(fèi)大部分時間(或者很多時間)的例程上去。
            一旦你確定了需要更高代碼效率的例程,可以運(yùn)用下面的一種或者多種技術(shù)來減少它們的執(zhí)行時間。

            inline 函數(shù)
            在 c++中,關(guān)鍵字inline 可以被加入到任何函數(shù)的聲明。這個關(guān)鍵字請求編譯器用函數(shù)內(nèi)部的代碼替換所有對于指出的函數(shù)的調(diào)用。這樣做刪去了和實(shí)際函數(shù)調(diào)用相關(guān)的時間開銷,這種做法在inline 函數(shù)頻繁調(diào)用并且只包含幾行代碼的時候是最有效的。

            inline 函數(shù)提供了一個很好的例子,它說明了有時執(zhí)行的速度和代碼的太小是如何反向關(guān)聯(lián)的。重復(fù)的加入內(nèi)聯(lián)代碼會增加你的程序的大小,增加的大小和函數(shù)調(diào)用的次數(shù)成正比。而且,很明顯,如果函數(shù)越大,程序大小增加得越明顯。優(yōu)化后的程序運(yùn)行的更快了,但是現(xiàn)在需要更多的ROM。

            查詢表
            switch 語句是一個普通的編程技術(shù),使用時需要注意。每一個由tb機(jī)器語言實(shí)現(xiàn)的測試和跳轉(zhuǎn)僅僅是為了決定下一步要做什么工作,就把寶貴的處理器時間耗盡了。為了提高速度,設(shè)法把具體的情況按照它們發(fā)生的相對頻率排序。換句話說,把最可能發(fā)生的情況放在第一,最不可能的情況放在最后。這樣會減少平均的執(zhí)行時間,但是在最差情況下根本沒有改善。

            如果每一個情況下都有許多的工作要做,那么也許把整個switch 語句用一個指向函數(shù)指針的表替換含更加有效。比如,下面的程序段是一個待改善的候選對象:

            enum NodeType {NodeA, NodeB, NodeC}
            switch(getNodeType())
            {
            case NodeA:
            ...
            case NodeB:
            ...
            case NodeC:
            ...
            }
            為了提高速度,我們要用下面的代碼替換這個switch 語句。這段代碼的第一部分是準(zhǔn)備工作:一個函數(shù)指針數(shù)組的創(chuàng)建。第二部分是用更有效的一行語句替換switch 語句。

            int processNodeA(void);
            int processNodeB(void);
            int processNodeC(void);
            /*
            * Establishment of a table of pointers to functions.
            */
            int (* nodeFunctions[])() = { processNodeA, processNodeB, processNodeC };
            ...
            /*
            * The entire switch statement is replaced by the next line.
            */
            status = nodeFunctions[getNodeType()]();

            手工編寫匯編
            一些軟件模塊最好是用匯編語言來寫。這使得程序員有機(jī)會把程序盡可能變得有效率。盡管大部分的C/C++編譯器產(chǎn)生的機(jī)器代碼比一個一般水平的程序員編寫的機(jī)器代碼要好的多,但是對于一個給定的函數(shù),一個好的程序員仍然可能做得比一般水平的編譯器要好。比如,在我職業(yè)生涯的早期,我用C 實(shí)現(xiàn)了一個數(shù)字濾波器,把它作為TI TMS320C30 數(shù)字信號處理器的輸出目標(biāo)。當(dāng)時我們有的tb編譯器也許是不知道,也許是不能利用一個特殊的指令,該指令準(zhǔn)確地執(zhí)行了我需要的那個數(shù)學(xué)操作。我用功能相同的內(nèi)聯(lián)匯編指令手工地替換了一段C 語言的循環(huán),這樣我就能夠把整個計算時間降低了十分之一以上。

            寄存器變量
            在聲明局部變量的時候可以使用 register 關(guān)鍵字。這就使得編譯器把變量放入一個多用選的寄存器,而不是堆棧里。合適地使用這種方琺,它會為編譯器提供關(guān)于最經(jīng)常訪問變量的提示,會稍微提高函數(shù)的執(zhí)行速度。函數(shù)調(diào)用得越是頻繁,這樣的改變就越是可能提高代碼的速度。

            全局變量
            使用全局變量比向函數(shù)傳遞參數(shù)更加有效率。這樣做去除了函數(shù)調(diào)用前參數(shù)入棧和函數(shù)完成后參數(shù)出棧的需要。實(shí)際上,任何子程序最有效率的實(shí)現(xiàn)是根本沒有參數(shù)。然而,決定使用全局變量對程序也可能有一些負(fù)作用。軟件工程人士通常不鼓勵使用全局變量,努力促進(jìn)模塊化和重入目標(biāo),這些也是重要的考慮。

            輪詢
            中斷服務(wù)例程經(jīng)常用來提高程序的效率。然而,也有少數(shù)例子由于過度和中斷關(guān)聯(lián)而造成實(shí)際上效率低下。在這些情況中,中斷間的平均時間和中斷的等待時間具有相同量級。這種情況下,利用輪詢與硬件設(shè)備通信可能會更好。當(dāng)然,這也會使軟件的模塊更少。

            定點(diǎn)運(yùn)算
            除非你的目標(biāo)平臺包含一個浮點(diǎn)運(yùn)算的協(xié)處理器,否則你會費(fèi)很大的勁去操縱你程序中的浮點(diǎn)數(shù)據(jù)。編譯器提供的浮點(diǎn)庫包含了一組模仿浮點(diǎn)運(yùn)算協(xié)處理器指令組的子程序。很多這種函數(shù)要花費(fèi)比它們的整數(shù)運(yùn)算函數(shù)更長的執(zhí)行時間,并且也可能是不可重入的。

            如果你只是利用浮點(diǎn)數(shù)進(jìn)行少量的運(yùn)算,那么可能只利用定點(diǎn)運(yùn)算來實(shí)現(xiàn)它更好。雖然只是明白如何做到這一點(diǎn)就夠困難的了,但是理論上用定點(diǎn)運(yùn)算實(shí)現(xiàn)任何浮點(diǎn)計算都是可能的。(那就是所謂的浮點(diǎn)軟件庫。)你最大的有利條件是,你可能不必只是為了實(shí)現(xiàn)一個或者兩個計算而實(shí)現(xiàn)整個IEEE 754 標(biāo)準(zhǔn)。如果真的需要那種類型的完整功能,別離開編譯器的浮點(diǎn)庫,去尋找其他加速你程序的方法吧。


             

            posted on 2013-07-23 17:19 tbwshc 閱讀(295) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            一级做a爰片久久毛片免费陪| 亚洲午夜久久久精品影院| 久久久久国色AV免费观看| 亚洲午夜久久久| 久久这里只有精品18| 久久精品国产亚洲7777| 模特私拍国产精品久久| 大美女久久久久久j久久| 色欲久久久天天天综合网| 精品久久综合1区2区3区激情| 久久九九有精品国产23百花影院| 久久国产欧美日韩精品| 久久久久国产日韩精品网站| 国产精品成人久久久| 怡红院日本一道日本久久 | 久久久久亚洲精品男人的天堂| 亚洲AV日韩精品久久久久久久| 99久久精品费精品国产一区二区| 麻豆久久久9性大片| 91久久精品国产免费直播| 欧美伊人久久大香线蕉综合| 国产无套内射久久久国产| 亚洲人成伊人成综合网久久久 | 久久亚洲欧美国产精品| 久久亚洲国产精品123区| 久久免费精品视频| 久久精品黄AA片一区二区三区| 亚洲女久久久噜噜噜熟女| 久久久久久噜噜精品免费直播| 久久av无码专区亚洲av桃花岛| 亚洲国产日韩欧美久久| 国产精品美女久久久久av爽 | 男女久久久国产一区二区三区| 合区精品久久久中文字幕一区| 日本加勒比久久精品| 国产精品成人久久久久久久| 国产69精品久久久久9999| 久久精品国产亚洲网站| 国产精品日韩欧美久久综合| 国产成人精品久久免费动漫| 久久99精品国产自在现线小黄鸭|