優化程式效能

2021-09-30 04:26:00 字數 1615 閱讀 4019

研究彙編**是理解編譯器以及產生的**會如何執行的最有效的手段之一。

編譯器優化**的限制:

1、程式設計中存在「儲存器別名使用」的問題。編譯器必須假設不同的指標可能指向儲存器中相同的位置。

2、函式呼叫(簡略了。。。具體看書)

~~~~~~~~~~~~~~~基本的編碼原則:效能大幅度提公升~~~~~~~~~~~~~~~~~~~

優化程式效能的一些方法:

1、將除錯完的程式完成編譯器級別上的優化。(這個目前還沒找到。。。)

2、**移出

這類優化包括識別出要執行多次(例如,在迴圈裡)但是計算結果不會改變的計算,因而我們可以把計算移動到**前面的、不會被多次求值的部分。

3、減少過程呼叫

因為程式執行過程中過程呼叫(反覆的過程呼叫)是非常耗時的,可以考慮是否能夠損失部分的模組性和抽象性來提高程式的效率。

當然這樣做肯定會損害程式的可讀性,但是只要稍加注釋,完全可以避免的。

完全可以對資料進行直接的訪問。

4、消除不必要的儲存器引用

通過使用區域性變數來代替實際的頻繁的儲存器引用。這樣做對程式執行速度的提高是非常明顯的。

在所有的基本算術運算中 除法運算是最消耗時間的。

~~~~~~~~~~~~~~~~低階別的程式優化技術:效能提公升很小的~~~~~~~~~~~~~~~

降低迴圈開銷:

可以通過在每次迭代中執行更多的資料操作來減少迴圈開銷的影響,使用的是迴圈展開的技術。其思想是在一次迭代中對多個陣列元素進行訪問和合併操作。這樣得到的程式需要更少的迭代,從而降低了迴圈的開銷。

如果迴圈展開k次,就把上限設定為n-k+1.那麼最大的迴圈索引i+k-1會比n小。

void combine5(vec_ptr v,data_t* dest){

int length=vec_length(v);

int limit=length-2;

data_t* data=get_vec_start(v);

data_t x=indent;

int i;

//combine 3 elements at a time

for(i=0; i轉換到指標**:

在運算元組的程式中,可以方便得把陣列轉化為指標操作,但是這樣做的結果是:程式執行效率上不會有太大的提高。

提高並行性:

對於乙個可結合可交換的操作(前提條件,沒有這個,扯淡)來說,比如說整數的加法和乘法,我們可以通過將一組合併操作分割成兩個或多個部分,並在最後合併結果來提高效能。

void combine6(vec_ptr v,data_t* dest){

int length=vec_length(v);

int limit=length-1;

data_t* data=get_vec_start(v) ;

data_t x0=indet;

data_t x1=ident;

int i;

//combine 2 elements at a time

for(i= 0; i這裡使用的是2次展開迴圈並使用二路並行。

但是注意:ia32指令集只有很少量的暫存器來存放累積的值。如果並行度p超過了當前可用的暫存器數量,編譯器會訴諸於溢位(spilling),將某些臨時值存放到棧中,這樣效能會急劇下降。

優化程式效能

編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...

優化程式效能

l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...

cpp程式效能優化

1.重中之重 演算法優化 程式效能優化最顯著的優化方法是演算法上的優化,演算法的優化對效能的提公升往往是乙個數量級的,例如排序,冒泡的時間複雜度為o n 2 而快速排序的時間複雜度為o nlog n 這種效能的提供是非常明顯的。2.消除冗餘的迴圈 我們先看一下for迴圈生成的彙編 for int n...