華爲C語言編程規範(8)—程序效率

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

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

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

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

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

7-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;

7-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 */

7-6:仔細分析有關算法,並進行優化。仔細考查、分析系統及模塊處理輸入(如事務、消息等)的方式,並加以改進。

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

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

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

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

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

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

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

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

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

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

說明:減少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];
}
}

7-13:儘量減少循環嵌套層次。

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

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

示例:如下代碼效率稍低。
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
- 22 -
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;
}
}

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

說明:浮點運算除法要佔用較多CPU 資源。
示例:如下表達式運算可能要佔較多CPU 資源。
#define PAI 3.1416
radius = circle_length / (2 * PAI);

應如下把浮點除法改爲浮點乘法。
#define PAI_RECIPROCAL (1 / 3.1416 ) // 編譯器編譯時,將生成具體浮點數
radius = circle_length * PAI_RECIPROCAL / 2;

7-16:不要一味追求緊湊的代碼。
說明:因爲緊湊的代碼並不代表高效的機器碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章