資源描述:
《在優(yōu)化程序代碼大小的諸多技術(shù)中》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、在優(yōu)化程序代碼大小的諸多技術(shù)中,大多包括從代碼中刪除不必要的元素。在編譯應(yīng)用程序時,VisualBasic自動刪除某些元素。而標識符名稱、注釋、空行的長度或數(shù)量是無須限制的,當應(yīng)用程序作為一個.EXE文件運行時,以上這些元素都不會影響應(yīng)用程序所占內(nèi)存的大小。其他元素,如變量、窗體和過程,確實要占據(jù)內(nèi)存的一部分空間。最好將它們精簡以使效率更高。下面介紹6種方法可用于縮小應(yīng)用程序所需內(nèi)存和減少代碼大小,希望能對初學者有所幫助。 1、減少加載窗體、控件數(shù)目和用標簽代替文本框 每一個加載的窗體,無論可視與否,都要占據(jù)一定數(shù)量的內(nèi)存(其數(shù)量隨窗體上控件的類型和數(shù)量,以及窗體上位圖的大
2、小等的不同而變化)。只在需要顯示時才加載窗體,不再需要時卸載窗體(而不是隱藏窗體)。記住,任何對窗體的屬性、方法或控件的引用,或?qū)τ肗ew聲明的窗體變量的引用,都會導致VisualBasic加載該窗體。 使用Unload方法卸載窗體時,只能釋放部分窗體所占空間。要釋放所有空間,可用關(guān)鍵字Nothing使窗體的引用無效:SetForm=Nothing 當設(shè)計應(yīng)用程序時,窗體應(yīng)盡量少用控件。實際的限制取決于控件的類型和系統(tǒng),但實際上,含有大量控件的窗體將運行緩慢。一項與之相關(guān)的技術(shù)是:設(shè)計時盡可能地使用控件數(shù)組,而不是在窗體上放置大量同類型的控件??丶?shù)組是一組具有共同名稱和類
3、型的控件。它們的事件過程也相同。在設(shè)計時,使用控件數(shù)組添加控件所消耗的資源比直接向窗體添加多個相同類型的控件消耗的資源要少。當希望若干控件共享代碼時,控件數(shù)組也很有用。標簽控件Label占用的Windows資源比文本框Textbox少,因此在可能的情況下,應(yīng)使用標簽代替文本框。例如,當窗體上需要一個隱藏的控件保存文本時,使用標簽更有效。 2、使用磁盤文件或資源和組織模塊 在設(shè)計時,直接放入應(yīng)用程序的數(shù)據(jù)(象屬性或代碼中的文字字符串和數(shù)值)將增加運行時應(yīng)用程序占用的內(nèi)存。運行時從磁盤文件或資源中加載數(shù)據(jù)可減少占用內(nèi)存。這對大位圖和字符串特別有價值。資源文件實際上是由一系列獨立
4、的字符串、位圖或者其他項目組成的,其中每一項都有一個唯一的標識符??梢允褂妙愃朴谠贛icrosoftVisualC++中提供的文本編輯器和資源編譯器創(chuàng)建資源文件。編譯過的資源文件帶有.res擴展名。 VisualBasic只在需要時才加載模塊即當代碼調(diào)用模塊中的一個過程時,模塊才被加載到內(nèi)存。如果從未調(diào)用一特定模塊中的過程,VisualBasic決不加載該模塊。因此,盡量把相關(guān)的過程放在同一模塊中,讓VisualBasic只在需要時才加載模塊?! ?、考慮替換Variant數(shù)據(jù)類型 Variant數(shù)據(jù)類型使用極其靈活,但是比其他數(shù)據(jù)類型所占內(nèi)存大。當要壓縮應(yīng)用程序多余的空間
5、時,應(yīng)考慮用其他數(shù)據(jù)類型替代Variant變量,特別是替代Variant變量數(shù)組?! ∶恳粋€Variant占用16個字節(jié),而Integer占2個字節(jié),Double占8個字節(jié)。變長字符串變量占用4個字節(jié)加上字符串中每一個字符占用1個字節(jié),但是,每一個包含字符串的Variant都要占用16個字節(jié)加上字符串中每一個字符占用1個字節(jié)。因為它們太大,因此在用作局部變量或過程的參數(shù)時,Variant變量是特別煩人的,這是因為它們消耗堆??臻g太快。但在有些情況下,使用其他數(shù)據(jù)類型替代Variant,靈活性降低了,為彌補損失的靈活性,不得不增加更多的代碼。結(jié)果是大小沒有真正的減小。 4、使用
6、動態(tài)數(shù)組并在刪除時回收內(nèi)存 使用動態(tài)數(shù)組代替固定數(shù)組。當不再需要動態(tài)數(shù)組的數(shù)據(jù)時,用Erase或ReDimPreserve放棄不需要的數(shù)據(jù),并回收數(shù)組所用內(nèi)存。例如,用以下代碼可回收動態(tài)數(shù)組所用空間:EraseMyArray 里,Erase完全刪除數(shù)組,ReDimPreserve則只縮短數(shù)組而不丟失其內(nèi)容:ReDimPreserveMyArray(10,smallernum) 刪除了固定大小數(shù)組,也不能回收該數(shù)組所占空間--只是簡單地清除數(shù)組每一元素中的值。如果元素是字符串,或包含字符串或數(shù)組的Variant變量,那么刪除數(shù)組可回收這些字符串或Variants所占內(nèi)存,而
7、不是數(shù)組本身所占內(nèi)存。 5、回收被字符串或?qū)ο笞兞坑眠^的空間 當過程結(jié)束時,可自動回收(非靜態(tài))局部字符串和數(shù)組變量所用空間。但是,全局和模塊級的字符串和數(shù)組變量一直存活到整個程序結(jié)束。要想應(yīng)用程序盡量小,就得盡可能回收這些變量所用空間。將零長度字符串賦給字符串變量,可回收其空間:SomeStringVar=""'回收空間 同樣,將對象變量設(shè)置成Nothing可回收該對象所用的部分(而不是全部)空間。例如,刪除一個Form對象變量:GlobalFAsNewStatusFormF.Sho