如何提高程式效率

2021-06-05 20:56:22 字數 3417 閱讀 9880

一、程式效率

程式效率,是用執行的步驟(step)數――時間複雜度、佔記憶體的多少來衡量的――空間複雜度。完成某項工作,執行的步驟(step)的次數最少、

占用記憶體最小是程式設計師所追求的。特別是嵌入式系統的開發,記憶體等資源都是有限的。

因此,提高效率的著眼點應該是

減少執行次數

減少占用空間

二、效率改善的指導原則

-滿足正確性、可靠性、健壯性、可讀性等質量因素的前提下,設法提高程式的效率;

如果程式的正確性、可靠性得不到保證,提高效率就失去了根本;

如果程式的健壯性得不到保證,提高效率就失去了目標;

如果程式的可讀性得不到保證,提高效率就失去了方向;

-以提高程式的全域性效率為主,提高區域性效率為輔;

如何只從區域性角度出發,區域性效率的改善一般對全域性效率改善作用不大,有時甚至影響全域性效率的改善;

應該從全域性角度出發,整體考慮,作出統一改善的調整,有的時候區域性利益為配合整體需要應作出犧牲;

-在優化程式的效率時,應當先找出限制效率的「瓶頸」;

非關鍵點的改善,不會根本改變效率的現狀;

先進行一些基準資料測量和問題收集,尋找提高效率的關鍵點;

有時一次關鍵的改動還不能解決問題,還需要進一步的資料測量和持續的改進,直到符合要求;

-先優化資料結構和演算法,再優化執行**;

因為o(n2)的演算法寫不出o(nlog2n)的程式,因此寫程式前應該考慮資料結構和演算法的選擇和優化;

如果你已經選擇了正確的演算法,那麼只有到了寫程式的最後,才有可能去關心執行**的優化問題;

-時間效率和空間效率可能對立,此時應當分析那個更重要,作出適當的折衷;

一般來講,在空間允許的時候,我們會花費空間換取時間效率的大幅提公升;

當空間受限--時間效率和空間對立的時候,我們根據需要,在兩者之間作出適當折中;

三、時間效率改善的考慮

-減少記憶體分配的次數

一次能夠申請的記憶體,就不要多次申請;

被多次訪問函式中儲存「不變數」的變數請定義成為static。如:

getlocalhostname(char* name) 

如果這是乙個經常呼叫的函式,每次呼叫時都要對funcname進行分配記憶體,這個開銷很大啊。把這個變數宣告成static吧,當函式再次被呼叫時,就會省去了分配記憶體的開銷,執行效率也很好。 

-提高迴圈體效率

減少迴圈次數

減少迴圈體內執行語句的數量

在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的迴圈放在最外層,以減少cpu 跨切迴圈層的次數

下面例子a和例子b的功能一樣,但效率不同

例a:  

for (i=0; i<5;i++)

}

例b:  

for (j=0; j<100;j++)

}

-減少指標定位

指標(->)使用很方便,但實際執行往往需要進行位址計算;不必要的位址計算會導致效能的下降;

盡可能減少->的多級巢狀。

-提高數學表示式的效率

a*b + a*c = a*(b+c); 減少一次乘法,但不改變表示式的意義。

b/a + c/a = (1/a)*(b+c); 把兩次除法變成一次除法和一次乘法,在幾乎所有的平台上,除法都比乘法慢。

(a || b ) && c ) = c && ( a || b ); 當c為假時,第乙個表示式要計算( a || b ),第二個表示式則不計算。

四、空間效率改善的考慮

合理結構體成員定義順序:按照型別從小到大,相同型別連續存放

例a和例b的占用的空間是不同的: 例a

typedef  struct  aa_t;
例b

typedef struct

short a;

short c;

int b;

} bb_t

-冗餘資料壓縮,可以減少對記憶體的占用

如有些矩陣資料的儲存。有些矩陣中的非零元素很少,可以考慮通過只儲存非零資料來減少對儲存空間的占用。

-動態記憶體使用的方式,可以提高記憶體的利用率。

追求空間的效率和追求時間的效率,往往是矛盾的,需要全面權衡。

-減少**的行數可以減少rom的占用

對於嵌入系統而言,rom資源是很寶貴的。減少**行數是減少rom佔用量 的有效途徑;

減少**行的方法:

消除冗餘**可以有效減少**行數

通過函式指標和函式表可以減少程式**規模

四、幾個例項

效率改善的例a

請理解下面的**

for( int i = 0; i < numpixels;i++ )

做如下修改是否更好

unsigned char *back_su***ce_bits = rendering_context->back_buffer->su***ce->bits;

for( int i = 0; i < numpixels;i++ )

還可以進一步修改

unsigned char *back_su***ce_bits = rendering_context->back_buffer->su***ce->bits;

for( int i = 0; i < numpixels;i++,back_su***ce_bits++ )

效率改善的例b

問題:有一組處理函式:functiona, functionb,… functionz,它們的函式形式如下

int functiona(int event)

int functionb(int event)

…… int functionz(int event)

他們分別是不同狀態(a,b…,z)的處理。編寫這段處理**,我們該如何做?

下面**可行嗎?

switch (status)

可行!但是不好!原因是生成目標**大,而且可維護弱一些。

這麼做可以解決上面提到的缺點

typdef  int (*pfunc)(int event);

typedef enum status_t;

pfunc functionlist[z] =;

status_t status;

……status被賦值

……functionlist[status](event);

這麼做是不是更好?

提高程式的效率

程式的時間效率是指執行速度,空間效率是指程式占用記憶體或者外存的狀況。全域性效率是指站在整個系統的角度上考慮的效率,區域性效率是指站在模組或函式角度上考慮的效率。l 規則 8 2 1 不要一味地追求程式的效率,應當在滿足正確性 可靠性 健壯性 可讀性等質量因素的前提下,設法提高程式的效率。l 規則 ...

怎樣提高程式效率

工作和學習中經常遇到程式執行很慢,效率低的問題,根據平時的工作,自己總結了一些提高程式效率的方法,持續更新中。方法 1 利用快取思想,用空間換時間。比如向量字型freetype顯示慢,可以快取起來一部分常用的字型。比如解析一張通用的,顯示比較緩慢,可以解析出來以後把資料快取起來。2 傳遞指標比傳遞引...

如何提高程式設計師鍵盤使用效率

對於大多數程式設計師而言,鍵盤的使用時長或許比滑鼠更多,所以對於如何使用鍵盤來提高工作效率是乙個非常重要的問題,本文章通過以下幾個方面來提公升程式設計師的鍵盤使用效率 一 程式設計師常用的快捷鍵及vi指令 自從70年代起,vi一直是程式設計師最好的夥伴之一,無論你是vi新手或者是老手,下面分類給出了...