對程式進行最佳化,是軟體開發工程師必然會涉及到的問題。那麼為什麼要對程式進行最佳化呢?原因有以下幾個:
第一,在原程式基礎之上新增、刪除或修改了功能,需要改變原程式流程。客戶需求隨時可能會變化,今天已經實現的功能,說不定明天就要修改或去掉。落實到程式上面,就需要我們隨時準備對寫好的代碼進行修改,而不要奢望寫好之後就永遠不要動了。
第二,原程式有bug。這類情況出現得非常的頻繁,很多軟體有1.0、2.0、3.0等版本,部分原因就是前面版本中程式有問題,在修改程式的過程中使得軟體版本不斷升級。
第三,原程式效率較低或不便於閱讀,對程式進行最佳化之後可提高效率或更易於閱讀。在軟體項目中,對每個函數包含的程式碼數都有一定的規定,如果超出了規定的行數,就要考慮對代碼進行最佳化,將部分函數提取出來單獨寫成一個函數。
有關程式最佳化,我們要遵循以下兩個原則:
第一,“小步快跑”原則。這個原則是指每修改一點點就對程式進行測試,測試通過之後再修改一點點,再進行測試。如此不斷地迴圈下去,直到程式修改完成並測試通過。這樣可以確保程式功能的正確性,減少後期重大變更所帶來的成本。
第二,“兩頂帽子”原則。一頂是只重構代碼而不新增功能,一頂是增加新的功能以實現新需求。即如果發現原程式存在諸多問題,需要先進行最佳化後再添加新的功能,那麼第一步就最佳化原代碼而不增加新功能,第二步在新代碼的基礎之上添加新代碼以實現新功能。
本文以一個實際的程式為例,詳細介紹如何對程式碼進行最佳化。
1.最佳化之前的程式
本程式實現將輸入字串中的大寫字母變成小寫字母的功能,具體代碼如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> void main() { char s[100]; unsigned int i; scanf("%s", s); for(i=0; i<strlen(s);i++) { s[i]=tolower(s[i]); } printf("%s\n", s); }
可以看出,本程式存在如下問題:
(1)代碼排版不工整且無注釋。
(2)變數命名不規範,且在定義的同時沒有進行初始化。
(3)代碼縮排不規範,for語句的書寫不規範。
(4)對於輸入和輸出,沒有相應的文字提醒。
(5)對於大寫轉換為小寫功能,可考慮封裝為一個函數,利於閱讀和其它的模組調用。
可以看出,雖然程式能夠實現基本的功能,但並非最優的。以下我們將逐步對代碼進行最佳化。
2.對代碼進行最佳化
Step 1:重新對程式排版,並添加註釋
對於排版不工整且注釋過少的代碼,最佳化的第一步就是規範排版並添加必要的注釋。排版的規則是“{}”之內的語句相對於“{}”要縮排4個空格,同級的代碼要對齊。在程式的頭部、函數的頭部及關鍵語句處要添加註釋。
修改之後的代碼如下所示:
/********************************************************************** *著作權 (C)2014, Zhou Zhaoxiong。 * *檔案名稱: StrToLowerCase.c *檔案標識:無 *內容摘要:將輸入字串中的大寫字母變成小寫字母 *其它說明:無 *目前的版本: V1.0 *作 者: Zhou Zhaoxiong *完成日期: 20140426 * *修改記錄1://修改記錄,包括修改日期、版本號碼、修改人及修改內容 *修改日期: 20140426 *版本號碼: V1.0 *修改人: Zhou Zhaoxiong *修改內容:建立 **********************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /********************************************************************** *功能描述:主函數 *輸入參數:無 *輸出參數:無 *傳回值:無 *其它說明:無 *修改日期 版本號碼 修改人 修改內容 * ---------------------------------------------------------------------------------------------- *20140426 V1.0 Zhou Zhaoxiong 建立 ***********************************************************************/ void main() { char s[100]; unsigned int i; printf("Input the source string: "); scanf("%s", s); //讀入原始字串 for (i = 0; i < strlen(s); i ++) { s[i] = tolower(s[i]); //將字串中的大寫字母變成小寫字母,其它字元不變 } printf("Output the destination string: %s\n", s); //輸出目的字串 }
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/