Visual Basic代碼優(yōu)化的6條軍規(guī)
發(fā)表時(shí)間:2024-02-13 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在優(yōu)化程序代碼大小的諸多技術(shù)中,大多包括從代碼中刪除不必要的元素。在編譯應(yīng)用程序時(shí),Visual Basic自動(dòng)刪除某些元素。而標(biāo)識(shí)符名稱(chēng)、注釋、空行的長(zhǎng)度或數(shù)量是無(wú)須限制的,當(dāng)應(yīng)用程序作為一個(gè).EXE文件運(yùn)行時(shí),以上這些元素都不會(huì)影響應(yīng)用程序所占內(nèi)存的大小。其他元素,如變量、窗體和過(guò)程,確實(shí)要占...
在優(yōu)化程序代碼大小的諸多技術(shù)中,大多包括從代碼中刪除不必要的元素。在編譯應(yīng)用程序時(shí),Visual Basic自動(dòng)刪除某些元素。而標(biāo)識(shí)符名稱(chēng)、注釋、空行的長(zhǎng)度或數(shù)量是無(wú)須限制的,當(dāng)應(yīng)用程序作為一個(gè).EXE文件運(yùn)行時(shí),以上這些元素都不會(huì)影響應(yīng)用程序所占內(nèi)存的大小。其他元素,如變量、窗體和過(guò)程,確實(shí)要占據(jù)內(nèi)存的一部分空間。最好將它們精簡(jiǎn)以使效率更高。下面介紹6種方法可用于縮小應(yīng)用程序所需內(nèi)存和減少代碼大小,希望能對(duì)初學(xué)者有所幫助。
1、減少加載窗體、控件數(shù)目和用標(biāo)簽代替文本框
每一個(gè)加載的窗體,無(wú)論可視與否,都要占據(jù)一定數(shù)量的內(nèi)存(其數(shù)量隨窗體上控件的類(lèi)型和數(shù)量,以及窗體上位圖的大小等的不同而變化)。只在需要顯示時(shí)才加載窗體,不再需要時(shí)卸載窗體(而不是隱藏窗體)。記住,任何對(duì)窗體的屬性、方法或控件的引用,或?qū)τ肗ew聲明的窗體變量的引用,都會(huì)導(dǎo)致Visual Basic加載該窗體。
使用Unload方法卸載窗體時(shí),只能釋放部分窗體所占空間。要釋放所有空間,可用關(guān)鍵字Nothing使窗體的引用無(wú)效:
Set Form=Nothing
當(dāng)設(shè)計(jì)應(yīng)用程序時(shí),窗體應(yīng)盡量少用控件。實(shí)際的限制取決于控件的類(lèi)型和系統(tǒng),但實(shí)際上,含有大量控件的窗體將運(yùn)行緩慢。一項(xiàng)與之相關(guān)的技術(shù)是:設(shè)計(jì)時(shí)盡可能地使用控件數(shù)組,而不是在窗體上放置大量同類(lèi)型的控件?丶䲠(shù)組是一組具有共同名稱(chēng)和類(lèi)型的控件。它們的事件過(guò)程也相同。在設(shè)計(jì)時(shí),使用控件數(shù)組添加控件所消耗的資源比直接向窗體添加多個(gè)相同類(lèi)型的控件消耗的資源要少。當(dāng)希望若干控件共享代碼時(shí),控件數(shù)組也很有用。標(biāo)簽控件Label占用的Windows資源比文本框Textbox少,因此在可能的情況下,應(yīng)使用標(biāo)簽代替文本框。例如,當(dāng)窗體上需要一個(gè)隱藏的控件保存文本時(shí),使用標(biāo)簽更有效。
2、使用磁盤(pán)文件或資源和組織模塊
在設(shè)計(jì)時(shí),直接放入應(yīng)用程序的數(shù)據(jù)(象屬性或代碼中的文字字符串和數(shù)值)將增加運(yùn)行時(shí)應(yīng)用程序占用的內(nèi)存。運(yùn)行時(shí)從磁盤(pán)文件或資源中加載數(shù)據(jù)可減少占用內(nèi)存。這對(duì)大位圖和字符串特別有價(jià)值。資源文件實(shí)際上是由一系列獨(dú)立的字符串、位圖或者其他項(xiàng)目組成的,其中每一項(xiàng)都有一個(gè)唯一的標(biāo)識(shí)符?梢允褂妙(lèi)似于在Microsoft Visual C++中提供的文本編輯器和資源編譯器創(chuàng)建資源文件。編譯過(guò)的資源文件帶有.res擴(kuò)展名。
Visual Basic只在需要時(shí)才加載模塊即當(dāng)代碼調(diào)用模塊中的一個(gè)過(guò)程時(shí),模塊才被加載到內(nèi)存。如果從未調(diào)用一特定模塊中的過(guò)程,Visual Basic決不加載該模塊。因此,盡量把相關(guān)的過(guò)程放在同一模塊中,讓Visual Basic只在需要時(shí)才加載模塊。
3、考慮替換Variant數(shù)據(jù)類(lèi)型
Variant數(shù)據(jù)類(lèi)型使用極其靈活,但是比其他數(shù)據(jù)類(lèi)型所占內(nèi)存大。當(dāng)要壓縮應(yīng)用程序多余的空間時(shí),應(yīng)考慮用其他數(shù)據(jù)類(lèi)型替代Variant變量,特別是替代Variant變量數(shù)組。
每一個(gè)Variant占用16個(gè)字節(jié),而Integer占2個(gè)字節(jié),Double占8個(gè)字節(jié)。變長(zhǎng)字符串變量占用4個(gè)字節(jié)加上字符串中每一個(gè)字符占用1個(gè)字節(jié),但是,每一個(gè)包含字符串的Variant都要占用16個(gè)字節(jié)加上字符串中每一個(gè)字符占用1個(gè)字節(jié)。因?yàn)樗鼈兲,因此在用作局部變量或過(guò)程的參數(shù)時(shí),Variant變量是特別煩人的,這是因?yàn)樗鼈兿亩褩?臻g太快。但在有些情況下,使用其他數(shù)據(jù)類(lèi)型替代Variant,靈活性降低了,為彌補(bǔ)損失的靈活性,不得不增加更多的代碼。結(jié)果是大小沒(méi)有真正的減小。
4、使用動(dòng)態(tài)數(shù)組并在刪除時(shí)回收內(nèi)存
使用動(dòng)態(tài)數(shù)組代替固定數(shù)組。當(dāng)不再需要?jiǎng)討B(tài)數(shù)組的數(shù)據(jù)時(shí),用Erase或ReDim Preserve放棄不需要的數(shù)據(jù),并回收數(shù)組所用內(nèi)存。例如,用以下代碼可回收動(dòng)態(tài)數(shù)組所用空間:
Erase MyArray
里,Erase完全刪除數(shù)組,ReDim Preserve則只縮短數(shù)組而不丟失其內(nèi)容:
ReDim Preserve MyArray(10, smallernum)
刪除了固定大小數(shù)組,也不能回收該數(shù)組所占空間--只是簡(jiǎn)單地清除數(shù)組每一元素中的值。如果元素是字符串,或包含字符串或數(shù)組的Variant變量,那么刪除數(shù)組可回收這些字符串或Variants所占內(nèi)存,而不是數(shù)組本身所占內(nèi)存。
5、回收被字符串或?qū)ο笞兞坑眠^(guò)的空間
當(dāng)過(guò)程結(jié)束時(shí),可自動(dòng)回收(非靜態(tài))局部字符串和數(shù)組變量所用空間。但是,全局和模塊級(jí)的字符串和數(shù)組變量一直存活到整個(gè)程序結(jié)束。要想應(yīng)用程序盡量小,就得盡可能回收這些變量所用空間。將零長(zhǎng)度字符串賦給字符串變量,可回收其空間:
SomeString Var="" '回收空間
同樣,將對(duì)象變量設(shè)置成Nothing可回收該對(duì)象所用的部分(而不是全部)空間。例如,刪除一個(gè)Form對(duì)象變量:
Global F As New StatusForm
F.Show 1 'Form加載并以模態(tài)顯示
X=F.Text1.Text '用戶(hù)按下按鈕,隱藏窗體
Unload F '刪除窗體可視部分
Set F=Nothing '回收空間(模塊數(shù)據(jù))
即使沒(méi)有使用顯式窗體變量,也應(yīng)注意將不再用的窗體卸載,而不是簡(jiǎn)單地隱藏。
6、消除死代碼和無(wú)用的變量
在開(kāi)發(fā)和修改應(yīng)用程序時(shí),可能遺留了死代碼--代碼中的一個(gè)完整過(guò)程,而它并沒(méi)有被任何地方調(diào)用。也可能聲明了一些不用的變量。雖然在創(chuàng)建.exe文件中,Visual Basic確實(shí)可刪除無(wú)用的常數(shù),但不能刪除無(wú)用的變量和死代碼。注意要復(fù)查代碼,查找并刪除無(wú)用的變量和死代碼。如Debug.Print語(yǔ)句,在運(yùn)行.exe時(shí)被忽略,可它常常出現(xiàn)在.exe文件中。
當(dāng)創(chuàng)建.exe文件時(shí),含有字符串和變量作為參數(shù)的Debug.Print語(yǔ)句不會(huì)被編譯。但對(duì)于含有函數(shù)作為參數(shù)的Debug.Print語(yǔ)句,其本身被編譯器忽略,而函數(shù)則被編譯。因此,在應(yīng)用程序運(yùn)行時(shí),函數(shù)被調(diào)用,但返回值被忽略。因?yàn)樵?exe文件中,函數(shù)作為Debug.Print的參數(shù)出現(xiàn)時(shí),將占用空間和CPU周期時(shí)間,所以在生成exe文件前,最好刪除這些語(yǔ)句。
在"編輯"菜單中使用"查找"命令搜索特定變量的引用;蛘弋(dāng)每個(gè)模塊都含有Option Explicit語(yǔ)句時(shí),通過(guò)刪除或注釋該變量的聲明,并運(yùn)行應(yīng)用程序,可迅速發(fā)現(xiàn)變量是否被使用。若該變量被使用,則Visual Basic將出錯(cuò)。若不出錯(cuò),則該變量沒(méi)被使用。