轉自:http://blog.csdn.net/ce123/article/details/8888467
華爲軟件編程規範學習(八)--可測性
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.1416
- radius =circle_length / (2 * PAI);
應如下把浮點除法改爲浮點乘法。
- #define PAI_RECIPROCAL (1 / 3.1416 ) // 編譯器編譯時,將生成具體浮點數
- radius =circle_length * PAI_RECIPROCAL / 2;
8-12:不要一味追求緊湊的代碼
說明:因爲緊湊的代碼並不代表高效的機器碼。