華爲軟件編程規範學習(八)--可測性

轉自:http://blog.csdn.net/ce123/article/details/8888467

華爲軟件編程規範學習(八)--可測性

8-1:編程時要經常注意代碼的效率

說明:代碼效率分爲全局效率、局部效率、時間效率及空間效率。全局效率是站在整個系統的角度上的系統效率;局部效率是站在模塊或函數角度上的效率;時間效率是程序處理輸入任務所需的時間長短;空間效率是程序所需內存空間,如機器代碼空間大小、數據空間大小、棧空間大小等。

8-2:在保證軟件系統的正確性、穩定性、可讀性及可測性的前提下,提高代碼效率

說明:不能一味地追求代碼效率,而對軟件的正確性、穩定性、可讀性及可測性造成影響。

8-3:局部效率應爲全局效率服務,不能因爲提高局部效率而對全局效率造成影響

8-4:通過對系統數據結構的劃分與組織的改進,以及對程序算法的優化來提高空間效率

說明:這種方式是解決軟件空間效率的根本辦法。

示例:如下記錄學生學習成績的結構不合理。

  1. typedef unsigned char  BYTE;  
  2. typedef unsigned short WORD;  
  3. typedef struct STUDENT_SCORE_STRU  
  4. {  
  5.    BYTE name[8];  
  6.    BYTE age;  
  7.    BYTE sex;  
  8.    BYTE class;  
  9.    BYTE subject;  
  10.    float score;  
  11. } STUDENT_SCORE;  

因爲每位學生都有多科學習成績,故如上結構將佔用較大空間。應如下改進(分爲兩個結構),總的存貯空間將變小,操作也變得更方便。

  1. typedef struct STUDENT_STRU  
  2. {  
  3.    BYTE name[8];  
  4.    BYTE age;  
  5.    BYTE sex;  
  6.    BYTE class;  
  7. } STUDENT;  
  8. typedef struct STUDENT_SCORE_STRU  
  9. {  
  10.    WORD student_index;  
  11.    BYTE subject;  
  12.    float score;  
  13. } STUDENT_SCORE;  

8-5:循環體內工作量最小化

說明:應仔細考慮循環體內的語句是否可以放在循環體之外,使循環體內工作量最小,從而提高程序的時間效率。

示例:如下代碼效率不高。

  1. for (ind = 0; ind <MAX_ADD_NUMBER; ind++)  
  2. {  
  3.    sum += ind;  
  4.    back_sum = sum; /* backup sum */  
  5. }  

語句“back_sum = sum;”完全可以放在for語句之後,如下。

  1. for (ind = 0; ind <MAX_ADD_NUMBER; ind++)  
  2. {  
  3.    sum += ind;  
  4. }  
  5. back_sum  = sum;/* backup sum */  

其他

8-1:仔細分析有關算法,並進行優化

8-2:仔細考查、分析系統及模塊處理輸入(如事務、消息等)的方式,並加以改進

8-3:對模塊中函數的劃分及組織方式進行分析、優化,改進模塊中函數的組織結構,提高程序效率

說明:軟件系統的效率主要與算法、處理任務方式、系統功能及函數結構有很大關係,僅在代碼上下功夫一般不能解決根本問題。

8-4:編程時,要隨時留心代碼效率;優化代碼時,要考慮周全

8-5:不應花過多的時間拼命地提高調用不很頻繁的函數代碼效率

說明:對代碼優化可提高效率,但若考慮不周很有可能引起嚴重後果。

8-6:要仔細地構造或直接用匯編編寫調用頻繁或性能要求極高的函數

說明:只有對編譯系統產生機器碼的方式以及硬件系統較爲熟悉時,纔可使用匯編嵌入方式。嵌入彙編可提高時間及空間效率,但也存在一定風險。

8-7:在保證程序質量的前提下,通過壓縮代碼量、去掉不必要代碼以及減少不必要的局部和全局變量,來提高空間效率

說明:這種方式對提高空間效率可起到一定作用,但往往不能解決根本問題。

8-8:在多重循環中,應將最忙的循環放在最內層

說明:減少CPU切入循環層的次數。

示例:如下代碼效率不高。

  1. for (row = 0; row< 100; row++)  
  2. {  
  3.    for (col = 0; col < 5; col++)  
  4.     {  
  5.        sum += a[row][col];  
  6.     }  
  7. }  

可以改爲如下方式,以提高效率。

  1. for (col = 0; col< 5; col++)  
  2. {  
  3.    for (row = 0; row < 100; row++)  
  4.     {  
  5.        sum += a[row][col];  
  6.     }  
  7. }  

8-9:儘量減少循環嵌套層次

8-10:避免循環體內含判斷語句,應將循環語句置於判斷語句的代碼塊之中

說明:目的是減少判斷次數。循環體中的判斷語句是否可以移到循環體外,要視程序的具體情況而言,一般情況,與循環變量無關的判斷語句可以移到循環體外,而有關的則不可以。

示例:如下代碼效率稍低。

  1. for (ind = 0; ind < MAX_RECT_NUMBER; ind++)  
  2. {  
  3.     if(data_type == RECT_AREA)  
  4.     {  
  5.        area_sum += rect_area[ind];  
  6.     }  
  7.    else  
  8.     {  
  9.        rect_length_sum += rect[ind].length;  
  10.        rect_width_sum += rect[ind].width;  
  11.     }  
  12. }  

因爲判斷語句與循環變量無關,故可如下改進,以減少判斷次數。

  1. if (data_type ==RECT_AREA)  
  2. {  
  3.     for (ind = 0; ind < MAX_RECT_NUMBER; ind++)  
  4.     {  
  5.        area_sum += rect_area[ind];  
  6.     }  
  7. }  
  8. else  
  9. {  
  10.     for (ind = 0; ind < MAX_RECT_NUMBER; ind++)  
  11.     {  
  12.        rect_length_sum += rect[ind].length;  
  13.        rect_width_sum  += rect[ind].width;  
  14.     }  
  15. }  

8-11:儘量用乘法或其它方法代替除法,特別是浮點運算中的除法

說明:浮點運算除法要佔用較多CPU資源。

示例:如下表達式運算可能要佔較多CPU資源。

  1. #define PAI 3.1416  
  2. radius =circle_length / (2 * PAI);  

應如下把浮點除法改爲浮點乘法。

  1. #define PAI_RECIPROCAL (1 / 3.1416 ) // 編譯器編譯時,將生成具體浮點數  
  2. radius =circle_length * PAI_RECIPROCAL / 2;  

8-12:不要一味追求緊湊的代碼

說明:因爲緊湊的代碼並不代表高效的機器碼。

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章