1.前言
前幾天看了深入理解計算機系統的 程式優化。因為前邊兩章節涉及到了太多的彙編,而本人不是計算機科班出身,計算機基礎薄弱,看那些彙編**的確很吃力, 打算以後對彙編慢慢來學習吧。畢竟學習不是一日之功。
看到程式優化這章節,感觸頗深啊,平常一些程式設計細節沒有注意,其實都是影響到程式整體效能的因素,通過分析程式底層細節,如何呼叫等才知道如何影響到了程式。好了,下面根據書中講解,我來做一些簡要的總結。給自己學習到的東西做一下記錄吧。
2. 程式示例
本節主要講述我們的系統是如何將我們的**轉換成更有效的**,其實我們所做的程式,系統都在為我們默默的做程式優化。上一段**
/* $begin adt */ /* create abstract data type for vector */ typedef struct vec_rec, *vec_ptr; /* $end adt */
data_t是 這樣定義的,因為本書可能會分析道不同的資料型別對程式的影響。 tydef int data _t;可能考慮到使用合併的一些運算特別定義了:
#define indnt 0 #define op + 他對向量求和使用宣告: #define ident 1 #define op * #include #include "combine.h" /* $begin vec */ /* create vector of specified length */ vec_ptr new_vec(int len) result->data = data; } else result->data = null; return result; } /* * retrieve vector element and store at dest. * return 0 (out of bounds) or 1 (successful) */ int get_vec_element(vec_ptr v, int index, data_t *dest) /* return length of vector */ int vec_length(vec_ptr v) /* $end vec */ /* $begin get_vec_start */ data_t *get_vec_start(vec_ptr v) /* $end get_vec_start */ /* * set vector element. * return 0 (out of bounds) or 1 (successful) */ int set_vec_element(vec_ptr v, int index, data_t val) /* set vector length. if >= allocated length, will reallocate */ void set_vec_length(vec_ptr v, int newlen) v->len = newlen; } 在 合併函式1中 #include "combine.h" /* combining functions */ char combine1_descr = "combine1: maximum use of data abstraction"; /* $begin combine1 */ /* implementation with maximum use of data abstraction */ void combine1(vec_ptr v, data_t *dest) } /* $end combine1 */
未經優化的程式一般都是效率比較低的程式。在unix中,可以利用 『-o1』 命令進行簡單的優化。
3.消除迴圈低效率
上邊的**中,我們可以發現,在尋混內部for(i
=0; i
< vec_length(v); i
++) 中,我們每次迴圈都會呼叫vec_length(v)方法,其實求
vec_length(v)對程式是乙個比較繁瑣的的過程,當函式每次呼叫計算長度的時候就會產生效率低的問題,那麼我們就要進行如下改進
void combine2(vec_ptr v, data_t *dest) }
這個時候,我們將**移出了迴圈內部,我們只進行了一次
intlength
= vec_length(v); 求值。在書中有效率的比較已經達到了很大級別的提公升了效能。
下面再來乙個例子,
void lower1(char *s) /* convert string to lower case: faster */ void lower2(char *s) /* implementation of library function strlen */ /* compute length of string */ size_t strlen(const char *s) return length; }
在測試中,當對於個長度為1048576的字串來說lower2函式只要1.5毫秒,比lower1快樂了500000 多倍。這是乙個多麼驚人的數字,所以我們要好好分析一下程式。
5.減少過程呼叫
像我們看到那樣,過程呼叫會帶來相當大的開銷,而且妨礙大多數的形式程式優化。,在combin2中,可以看出,每次混換忒帶都會呼叫get_vec_elenment來獲取下乙個向量元素。對每個向量引用,這個函式把向量索引i與迴圈邊界作比較,很明顯會造成效率低下的。
那麼在combine函式中,我們增加乙個函式get_vec_start。這個函式返回陣列的起始位址。
data_t* get_vec_start(vect_pt v) char combine3_descr = "combine3: array reference to vector data"; /* $begin combine3 */ /* direct access to vector data */ void combine3(vec_ptr v, data_t *dest) } /* $end combine3 */
通過測試,提高效率比較小,那是怎麼回事呢?請看下邊一節。
6.消除不必要的儲存器引用
在這裡主要通過彙編**能看出,程式的不停儲存拷貝要是影響到程式的效率。
消除了無用儲存器的讀寫。
char combine4_descr = "combine4: array reference, accumulate in temporary"; /* $begin combine4 */ /* accumulate result in local variable */ void combine4(vec_ptr v, data_t *dest) *dest = x; } /* $end combine4 */
通過這個修改,可以看到程式又有了一大步的提公升。以上的**的重構讓我對程式的細節調整感受頗深。
對提高ASP執行效率的幾點看法
對提高asp執行效率的幾點看法 1 硬體問題 伺服器的設定和配置無疑是asp執行速度的最主要決定因素,但有關這方面的問題與mimi有關,無需羅嗦。2 避免在乙個頁面中是用多種指令碼語言 如 和因為如果在指令碼中混用多種指令碼語言,則伺服器不得不載入多個指令碼引擎,逐個解釋,這勢必會影響指令碼執行的效...
對Listview控制項的效率優化
convertview本身具有被重用的性質 static class viewholder 一般來說,我們在getview 裡面需要進行資料的繫結和事件的繫結,那麼我們就需要找到所用的控制項,也就是需要findviewbyid,但是如果在這個方法中,每次都findviewbyid這個方法,因為 fi...
對Listview控制項的效率優化
不管在android平台還是ios平台,listview或者是類似控制項,在資料顯示方面都佔據著相當重要的位置。而作為最重要的資料展示形式,listview控制項或者是類似的需要使用adapter的控制項的載入以及資料展示的效率和優化,就被擺在了乙個很重要的位置,本篇文章主要給大家介紹,如何可以實現...