華為軟體編程規範學習(八)–可測性

來源:互聯網
上載者:User

華為軟體編程規範學習(八)--可測性

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

說明:代碼效率分為全域效率、局部效率、時間效率及空間效率。全域效率是站在整個系統的角度上的系統效率;局部效率是站在模組或函數角度上的效率;時間效率是程式處理輸入任務所需的時間長短;空間效率是程式所需記憶體空間,如機器代碼空間大小、資料空間大小、棧空間大小等。

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

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

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

8-4:通過對系統資料結構的劃分與組織的改進,以及對程式演算法的最佳化來提高空間效率

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

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

typedef unsigned char  BYTE;typedef unsigned short WORD;typedef struct STUDENT_SCORE_STRU{   BYTE name[8];   BYTE age;   BYTE sex;   BYTE class;   BYTE subject;   float score;} STUDENT_SCORE;

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

typedef struct STUDENT_STRU{   BYTE name[8];   BYTE age;   BYTE sex;   BYTE class;} STUDENT;typedef struct STUDENT_SCORE_STRU{   WORD student_index;   BYTE subject;   float score;} STUDENT_SCORE;

8-5:迴圈體內工作量最小化

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

樣本:如下代碼效率不高。

for (ind = 0; ind <MAX_ADD_NUMBER; ind++){   sum += ind;   back_sum = sum; /* backup sum */}

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

for (ind = 0; ind <MAX_ADD_NUMBER; ind++){   sum += ind;}back_sum  = sum;/* backup sum */

其他

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

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

8-3:對模組中函數的劃分及組織方式進行分析、最佳化,改進模組中函數的組織圖,提高程式效率

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

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

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

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

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

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

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

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

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

說明:減少CPU切入迴圈層的次數。

樣本:如下代碼效率不高。

for (row = 0; row< 100; row++){   for (col = 0; col < 5; col++)    {       sum += a[row][col];    }}

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

for (col = 0; col< 5; col++){   for (row = 0; row < 100; row++)    {       sum += a[row][col];    }}

8-9:盡量減少迴圈嵌套層次

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

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

樣本:如下代碼效率稍低。

for (ind = 0; ind < MAX_RECT_NUMBER; ind++){    if(data_type == RECT_AREA)    {       area_sum += rect_area[ind];    }   else    {       rect_length_sum += rect[ind].length;       rect_width_sum += rect[ind].width;    }}

因為判斷語句與迴圈變數無關,故可如下改進,以減少判斷次數。

if (data_type ==RECT_AREA){    for (ind = 0; ind < MAX_RECT_NUMBER; ind++)    {       area_sum += rect_area[ind];    }}else{    for (ind = 0; ind < MAX_RECT_NUMBER; ind++)    {       rect_length_sum += rect[ind].length;       rect_width_sum  += rect[ind].width;    }}

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

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

樣本:如下運算式運算可能要佔較多CPU資源。

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.