青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tbwshc

tbw

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

常用鏈接

留言簿(4)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

事情應該盡可能簡化,而不只是簡單一點點,一愛因斯坦

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

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

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

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

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

inline 函數提供了一個很好的例子,它說明了有時執行的速度和代碼的太小是如何反向關聯的。重復的加入內聯代碼會增加你的程序的大小,增加的大小和函數調用的次數成正比。而且,很明顯,如果函數越大,程序大小增加得越明顯。優化后的程序運行的更快了,但是現在需要更多的ROM。

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

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

enum NodeType {NodeA, NodeB, NodeC}
switch(getNodeType())
{
case NodeA:
...
case NodeB:
...
case NodeC:
...
}
為了提高速度,我們要用下面的代碼替換這個switch 語句。這段代碼的第一部分是準備工作:一個函數指針數組的創建。第二部分是用更有效的一行語句替換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()]();

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

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

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

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

定點運算
除非你的目標平臺包含一個浮點運算的協處理器,否則你會費很大的勁去操縱你程序中的浮點數據。編譯器提供的浮點庫包含了一組模仿浮點運算協處理器指令組的子程序。很多這種函數要花費比它們的整數運算函數更長的執行時間,并且也可能是不可重入的。

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


 

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲小说春色综合另类电影| 国产精品每日更新| 欧美顶级大胆免费视频| 久久精品久久综合| 久久久久久尹人网香蕉| 猛干欧美女孩| 亚洲欧洲中文日韩久久av乱码| 亚洲午夜电影在线观看| 91久久久久久久久| 亚洲乱码国产乱码精品精天堂 | 久久久久久久一区二区| 久久五月激情| 欧美精品激情在线| 国产嫩草一区二区三区在线观看| 国产欧美日韩亚洲| 1000部精品久久久久久久久| 亚洲精品欧美精品| 久久精品动漫| 亚洲精品欧美日韩| 久久久久九九九| 欧美网站在线| 亚洲国产va精品久久久不卡综合| 正在播放欧美视频| 米奇777在线欧美播放| 夜夜狂射影院欧美极品| 久久久久久久91| 国产精品日韩欧美一区二区三区 | 免费在线看成人av| 国产精品视频免费观看www| 亚洲电影观看| 欧美在线视频播放| 一本一道久久综合狠狠老精东影业 | 亚洲国产精品va在线观看黑人 | 欧美成人三级在线| 亚洲永久视频| 欧美日韩国产三级| 最新高清无码专区| 久久久噜噜噜久噜久久| 一区二区三区四区五区在线| 久久综合精品一区| 国产一区二区黄| 亚洲欧美国产精品va在线观看| 欧美国产高清| 久久免费精品视频| 国产在线视频欧美| 午夜精品美女久久久久av福利| 亚洲国产日韩在线| 美日韩免费视频| 精品福利免费观看| 久久爱www| 亚洲一区二三| 欧美涩涩网站| 亚洲女女做受ⅹxx高潮| 91久久精品国产91性色| 久久激情五月激情| 国产日韩在线视频| 亚洲欧美日韩视频二区| 亚洲精品在线视频观看| 欧美国产精品一区| 日韩一本二本av| 亚洲人成7777| 欧美日产国产成人免费图片| 亚洲精选91| 亚洲日本在线观看| 欧美精品1区| 99热这里只有成人精品国产| 亚洲肉体裸体xxxx137| 欧美激情综合在线| 亚洲手机成人高清视频| 一区二区av在线| 国产精品一区二区欧美| 久久精品国产清自在天天线| 久久精品国产免费观看| 狠狠色狠狠色综合日日91app| 久久精品国产精品| 媚黑女一区二区| 一区二区日韩欧美| 亚洲欧美不卡| …久久精品99久久香蕉国产| 欧美激情一区二区在线| 欧美日韩国产色综合一二三四| 亚洲欧美日韩精品| 久久久亚洲成人| 一区二区av在线| 亚洲一区二区精品视频| 精品福利免费观看| 亚洲最快最全在线视频| 国产一区视频在线观看免费| 欧美成人午夜影院| 欧美性淫爽ww久久久久无| 久久精品一本| 欧美日本一区| 久久深夜福利免费观看| 欧美日韩国产一区二区| 久久久www免费人成黑人精品 | 91久久精品一区二区别| 一区二区不卡在线视频 午夜欧美不卡在 | 国产女人水真多18毛片18精品视频| 久久女同互慰一区二区三区| 欧美国产精品v| 在线一区二区三区四区| 亚洲网站在线| 国产一区二区中文| 亚洲人成网站影音先锋播放| 国产精品一二三视频| 亚洲丰满少妇videoshd| 国产目拍亚洲精品99久久精品| 欧美激情影音先锋| 国产一区二区电影在线观看| 亚洲精品久久久久久久久| 国内外成人在线| 中文一区二区| av不卡在线观看| 老鸭窝毛片一区二区三区| 欧美在线首页| 国产精品美女xx| 最新日韩av| 亚洲国产欧美一区| 久久精品视频播放| 久久精品国产亚洲5555| 国产精品毛片高清在线完整版| 亚洲国产日韩欧美在线99| 在线观看视频一区| 欧美中文字幕第一页| 久久xxxx精品视频| 国产欧美日韩一区二区三区在线| 99精品99| 亚洲视屏一区| 欧美午夜视频在线观看| 亚洲剧情一区二区| 夜夜嗨一区二区| 欧美日韩大陆在线| 亚洲日本无吗高清不卡| 99精品热视频只有精品10| 欧美国产欧美综合| 亚洲人成网站在线观看播放| 亚洲精品中文字幕在线| 欧美大片在线观看一区| 亚洲国产一区二区视频| 亚洲精品小视频在线观看| 欧美高清视频一区二区| 亚洲欧洲免费视频| 中文欧美在线视频| 国产精品日韩精品| 欧美一区二区免费观在线| 久久九九久精品国产免费直播| 国产一区欧美| 老司机凹凸av亚洲导航| 亚洲高清视频一区| 亚洲视频精选在线| 国产欧美不卡| 久久一区国产| 日韩一区二区免费看| 欧美一进一出视频| 狠狠色狠狠色综合| 欧美成人精品在线播放| 99视频在线观看一区三区| 欧美一区二区三区免费观看| 好看的日韩视频| 欧美大色视频| 亚洲欧美久久久| 欧美成人免费视频| 亚洲一区二区精品在线| 国产欧美日韩综合一区在线播放| 久久精品视频在线播放| 日韩午夜剧场| 久久综合久久美利坚合众国| 日韩午夜一区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美激情一二三区| 亚洲一区二区三区中文字幕| 一区二区三区免费看| 久久精品国产欧美亚洲人人爽| 亚洲电影第1页| 国产精品mv在线观看| 久久精品国产第一区二区三区最新章节| 欧美激情一区二区| 欧美资源在线观看| 日韩视频三区| 黄色成人精品网站| 欧美性大战久久久久久久| 久久中文在线| 午夜精品区一区二区三| 亚洲精品欧洲精品| 嫩草成人www欧美| 欧美一区二区三区精品电影| 日韩亚洲一区二区| 亚洲二区在线| 国产综合久久久久久鬼色| 欧美午夜不卡在线观看免费 | 一区二区三区在线免费视频| 国产精品jvid在线观看蜜臀| 免费久久99精品国产| 欧美一级片在线播放| 亚洲视频欧美在线| 亚洲看片免费| 日韩视频专区| 亚洲国产毛片完整版| 欧美成人影音| 免费视频亚洲|