在優化程式碼大小的諸多技術中,大多包括從程式碼中刪除不必要的元素。在編譯應用程式時,VisualBasic會自動刪除某些元素。而識別符名稱、註解、空行的長度或數量是無須限制的,當應用程式作為一個.EXE檔案運行時,以上這些元素都不會影響應用程式所佔記憶體的大小。其他元素,如變數、窗體和流程,確實要佔據記憶體的一部分空間。最好將它們精簡以使效率更高。以下介紹6種方法可用於縮小應用程式所需記憶體和減少程式碼大小,希望能對初學者有所幫助。
1.減少載入窗體、控制項數目和用標籤取代文字框
每一個載入的窗體,無論可視與否,都要佔據一定數量的內存(其數量隨窗體上控件的類型和數量,以及窗體上位圖的大小等的不同而變化)。只在需要顯示時才載入窗體,不再需要時卸載窗體(而不是隱藏窗體)。記住,任何對窗體的屬性、方法或控制項的引用,或對用New宣告的窗體變數的引用,都會導致VisualBasic載入該窗體。
使用Unload方法卸載窗體時,只能釋放部分視窗所佔空間。要釋放所有空間,可用關鍵字Nothing使窗體的引用無效:
當設計應用程式時,窗體應盡量少用控制。實際的限制取決於控制項的類型和系統,但實際上,含有大量控制項的窗體將運行緩慢。一項與之相關的技術是:設計時盡可能使用控制項數組,而不是在窗體上放置大量相同類型的控制項。控制項數組是一組具有共同名稱和類型的控制項。它們的事件過程也相同。在設計時,使用控制項陣列新增控制項所消耗的資源比直接向窗體新增多個相同類型的控制項消耗的資源少。當希望若干控制項共用程式碼時,控制項數組也很有用。標籤控制項Label佔用的Windows資源比文字方塊Textbox少,因此在可能的情況下,應使用標籤取代文字方塊。例如,當窗體上需要一個隱藏的控制項來保存文字時,使用標籤會更有效。
2、使用磁碟檔案或資源和組織模組
在設計時,直接放入應用程式的資料(象屬性或程式碼中的文字字串和數值)將增加運行時應用程式所佔用的記憶體。運行時從磁碟檔案或資源載入資料可減少佔用記憶體。這對大位圖和字串特別有價值。資源檔案實際上是由一系列獨立的字串、點陣圖或其他項目組成的,其中每一項都有一個唯一的識別碼。可以使用類似於在MicrosoftVisualC 中提供的文字編輯器和資源編譯器建立資源檔案。編譯過的資源檔帶有.res副檔名。
VisualBasic只在需要時才載入模組即當程式碼呼叫模組中的一個過程時,模組才會載入到記憶體。如果從未呼叫特定模組中的流程,VisualBasic絕不載入該模組。因此,盡量把相關的流程放在同一模組中,讓VisualBasic只在需要時才載入模組。
3.考慮替換Variant資料類型
Variant資料型別使用極為靈活,但是比其他資料型別所佔記憶體大。當要壓縮應用程式多餘的空間時,應考慮以其他資料類型取代Variant變量,特別是取代Variant變數數組。
每一個Variant佔用16個位元組,而Integer佔2個位元組,Double佔8個位元組。變長字串變數佔用4個位元組加上字串中每個字元佔用1個位元組,但是,每一個包含字串的Variant都要佔用16個位元組加上字串中每個字元佔用1個位元組。因為它們太大,因此在用作局部變數或過程的參數時,Variant變數是特別煩人的,這是因為它們消耗堆疊空間太快。但在某些情況下,使用其他資料類型取代Variant,彈性降低了,為彌補損失的彈性,不得不增加更多的程式碼。結果是大小沒有真正的減少。
4、使用動態數組並在刪除時回收內存
使用動態數組代替固定數組。當不再需要動態數組的數據時,用Erase或ReDimPReserve放棄不需要的數據,並回收數組所用記憶體。例如,用下列程式碼可回收動態數組所用空間:
裡,Erase完全刪除數組,ReDimPreserve則只縮短數組而不丟失其內容:
刪除了固定大小數組,也不能回收該數組所佔空間--只是簡單地清除數組每一元素中的值。如果元素是字串,或包含字串或數組的Variant變量,那麼刪除數組可回收這些字串或Variants所佔內存,而不是數組本身所佔內存。
5.回收被字串或物件變數用過的空間
當過程結束時,可自動回收(非靜態)局部字串和陣列變數所用空間。但是,全域和模組級的字串和陣列變數一直存活到整個程式結束。要想應用程式盡量小,就得盡可能回收這些變數所用空間。將零長度字串賦給字串變量,可回收其空間:
同樣,將物件變數設定成Nothing可回收該物件所使用的部分(而非全部)空間。例如,刪除一個Form物件變數:
即使沒有使用顯式窗體變量,也應注意將不再使用的窗體卸載,而不是簡單地隱藏。
6.消除死程式碼和無用的變數
在開發和修改應用程式時,可能遺留了死程式碼--程式碼中的一個完整過程,而它並沒有被任何地方呼叫。也可能宣告了一些不用的變數。雖然在建立.exe檔中,VisualBasic確實可刪除無用的常數,但不能刪除無用的變數和死程式碼。注意要重複程式碼,尋找並刪除無用的變數和死代碼。如Debug.Print語句,在執行.exe時被忽略,可它常常出現在.exe檔中。
當建立.exe檔時,含有字串和變數作為參數的Debug.Print語句不會被編譯。但對於含有函數作為參數的Debug.Print語句,本身就被編譯器忽略,而函數則被編譯。因此,在應用程式運行時,函數被調用,但返回值被忽略。因為在.exe檔中,函數作為Debug.Print的參數出現時,就會佔用空間和CPU週期時間,所以在產生exe檔前,最好刪除這些語句。
在"編輯"選單中使用"尋找"指令搜尋特定變數的引用。或者當每個模組都含有OptionExplicit語句時,透過刪除或註釋該變數的聲明,並執行應用程序,可迅速發現變數是否被使用。若該變數被使用,則VisualBasic將會出錯。若不出錯,則該變數沒被使用。 ->