提高VB代碼的執(zhí)行效率_第1頁
提高VB代碼的執(zhí)行效率_第2頁
提高VB代碼的執(zhí)行效率_第3頁
提高VB代碼的執(zhí)行效率_第4頁
提高VB代碼的執(zhí)行效率_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、簡介:本文描述了如何通過一些技術(shù)手段來提高VB代碼的執(zhí)行效率。這些手段可以分為兩個(gè)大的部分:編碼技術(shù)和編譯優(yōu)化技術(shù)。在編碼技術(shù)中介紹了如何通過使用高效的數(shù)據(jù)類型、減少外部引用等編程手段來提高代碼執(zhí)行速度,減少代碼消耗的系統(tǒng)資源。在編譯優(yōu)化技術(shù)中介紹了如何正確地利用VB提供的編譯選項(xiàng)對在編譯時(shí)最后生成的可執(zhí)行文件進(jìn)行優(yōu)化。前言什么是一個(gè)高效的軟件?一個(gè)高效的軟件不僅應(yīng)該比實(shí)現(xiàn)同樣功能的軟件運(yùn)行得更快,還應(yīng)該消耗更少的系統(tǒng)資源。這篇文章匯集了作者在使用VB進(jìn)行軟件開發(fā)時(shí)積累下來的一些經(jīng)驗(yàn),通過一些簡單的例子來向你展示如何寫出高效的VB代碼。其中包含了一些可能對VB程序員非常有幫助的技術(shù)。在開始之前

2、,先讓我陳清幾個(gè)概念。讓代碼一次成型:在我接觸到的程序員中,有很多人喜歡先根據(jù)功能需求把代碼寫出來,然后在此基礎(chǔ)上優(yōu)化代碼。最后發(fā)現(xiàn)為了達(dá)到優(yōu)化的目的,他們不得不把代碼再重新寫一遍。所以我建議你在編寫代碼之前就需要考慮優(yōu)化問題。把握好優(yōu)化的結(jié)果和需要花費(fèi)的工作之間的關(guān)系:通常當(dāng)完成了一段代碼,你需要檢查和修改它。在檢查代碼的過程中,也許你會(huì)發(fā)現(xiàn)某些循環(huán)中的代碼效率還可以得到進(jìn)一步的改進(jìn)。在這種情況下,很多追求完美的程序員也許會(huì)立馬修改代碼。我的建議是,如果修改這段代碼會(huì)使程序的運(yùn)行時(shí)間縮短一秒,你可以修改它。如果只能帶來10毫秒的性能改進(jìn),則不做任何改動(dòng)。這是因?yàn)橹貙懸欢未a必定會(huì)引入新的錯(cuò)誤

3、,而調(diào)試新的代碼必定會(huì)花掉你一定的時(shí)間。程序員應(yīng)該在軟件性能和開發(fā)軟件需要的工作量之間找一個(gè)平衡點(diǎn),而且10毫秒對于用戶來說也是一個(gè)不能體會(huì)到的差異。在需要使用面向?qū)ο蠓椒ǖ臅r(shí)候盡量使用它;VB提供的機(jī)制不完全支持面向?qū)ο蟮脑O(shè)計(jì)和編碼,但是VB提供了簡單的類。大多數(shù)人認(rèn)為使用對象將導(dǎo)致代碼的效率降低。對于這一點(diǎn)我個(gè)人有些不同的意見;考察代碼的效率不能純粹從運(yùn)行速度的角度出發(fā),軟件占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能,這一點(diǎn)我會(huì)在后面的例子中詳細(xì)說明。當(dāng)你編寫VB代碼的時(shí)候,希望你能把上面幾點(diǎn)作為指導(dǎo)你編碼的原則。我把文章分為兩個(gè)部分:如何提高代碼的運(yùn)行速度和

4、編譯優(yōu)化。如何提高代碼的運(yùn)行速度下面的這些方法可以幫助你提高代碼的運(yùn)行速度:使用整數(shù)(Integer)和長整數(shù)(Long)提高代碼運(yùn)行速度最簡單的方法莫過于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將Single,Double和Currency類型的變量替換為Integer或Long類型的變量,因?yàn)閂B處理Integer和Long的能力遠(yuǎn)遠(yuǎn)高于處理其它幾種數(shù)據(jù)類型。在大多數(shù)情況下,程序員選擇使用Single或Double的原因是因?yàn)樗鼈兡軌虮4嫘?shù)。但是小數(shù)也可以保存在Integer類型的變量中。例如程序中約定有三位小數(shù),那么

5、只需要將保存在Integer變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗(yàn),使用Integer和Long替代Single,Double和Currency后,代碼的運(yùn)行速度可以提高將近10倍。避免使用變體對于一個(gè)VB程序員來說,這是再明顯不過的事情了。變體類型的變量需要16個(gè)字節(jié)的空間來保存數(shù)據(jù),而一個(gè)整數(shù)(Integer)只需要2個(gè)字節(jié)。通常使用變體類型的目的是為了減少設(shè)計(jì)的工4作量和代碼量,也有的程序員圖個(gè)省事而使用它。但是如果一個(gè)軟件經(jīng)過了嚴(yán)格設(shè)計(jì)和按照規(guī)范編碼的話,完全可以避免使用變體類型。在這里順帶提一句,對于Object對象也存在同樣的問題。請看下面的代碼:DimFSOSetF

6、SO=NewScripting.FileSystemObject或DimFSOasobjectSetFSO=NewScripting.FileSystemObject上面的代碼由于在申明的時(shí)候沒有指定數(shù)據(jù)類型,在賦值時(shí)將浪費(fèi)內(nèi)存和CPU時(shí)間。正確的代碼應(yīng)該象下面這樣:DimFSOasNewFileSystemObject盡量避免使用屬性在平時(shí)的代碼中,最常見的比較低效的代碼就是在可以使用變量的情況下,反復(fù)使用屬性(Property),尤其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會(huì)使用到的:DimintConasIntegerForintCo

7、n=0toUbound(SomVar()Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)NextintCon下面這段代碼的執(zhí)行速度是上面代碼的20倍。DimintConasIntegerDimsOutputasStringForintCon=0toUbound(SomeVar()sOutput=sOutput&vbCrlf&SomeVar(intCon)NextText1.Text=sOutput盡量使用數(shù)組,避免使用集合除非你必須使用集合(Collection),否則你應(yīng)該盡量使用數(shù)組。據(jù)測試,數(shù)組的存取速度可以達(dá)到集合的100倍。這個(gè)數(shù)字聽起來有點(diǎn)駭

8、人聽聞,但是如果你考慮到集合是一個(gè)對象,你就會(huì)明白為什么差異會(huì)這么大。展開小的循環(huán)體在編碼的時(shí)候,有可能遇到這種情況:一個(gè)循環(huán)體只會(huì)循環(huán)2到3次,而且循環(huán)體由幾行代碼組成。在這種情況下,你可以把循環(huán)展開。原因是循環(huán)會(huì)占用額外的CPU時(shí)間。但是如果循環(huán)比較復(fù)雜,你就沒有必要這樣做了。避免使用很短的函數(shù)和使用小的循環(huán)體相同,調(diào)用只有幾行代碼的函數(shù)也是不經(jīng)濟(jì)的-調(diào)用函數(shù)所花費(fèi)的時(shí)間或許比執(zhí)行函數(shù)中的代碼需要更長的時(shí)間。在這種情況下,你可以把函數(shù)中的代碼拷貝到原來調(diào)用函數(shù)的地方。減少對子對象的引用在VB中,通過使用.來實(shí)現(xiàn)對象的引用。例如:Form1.Text1.Text在上面的例子中,程序引用了兩個(gè)

9、對象:Forml和Textl。利用這種方法引用效率很低。但遺憾的是,有辦法可以避免它。程序員唯一可以做就是使用With或者將用另一個(gè)對象保存子對象(Textl)。注釋:使用WithWithfrmMain.Textl.Text=LearnVB.Alignment=0.Tag=Itsmylife.BackColor=vbBlack.ForeColor=vbWhiteEndWith或者注釋:使用另一個(gè)對象保存子對象DimtxtTextBoxasTextBoxSettxtTextBox=frmMain.TextlTxtTextBox.Text=LearnVBTxtTextBox.Alignment=0

10、TxtTextBox.Tag=ItsmylifeTxtTextBox.BackColor=vbBlackTxtTextBox.ForeColor=vbWhite注意,上面提到的方法只適用于需要對一個(gè)對象的子對象進(jìn)行操作的時(shí)候,下面這段代碼是不正確的:WithTextl.Text=LearnVB.Alignment=0.Tag=Itsmylife.BackColor=vbBlack.ForeColor=vbWhiteEndWith很不幸的是,我們常??梢栽趯?shí)際的代碼中發(fā)現(xiàn)類似于上面的代碼。這樣做只會(huì)使代碼的執(zhí)行速度更慢。原因是With塊編譯后會(huì)形成一個(gè)分枝,會(huì)增加了額外的處理工作。檢查字符串是否為空大多數(shù)程序員在檢查字符串是否為空時(shí)會(huì)使用下面的方法:IfText1.Text=then注釋:執(zhí)行操作Endif很不幸,進(jìn)行字符串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:IfLen(Text1.Text)=0then注釋:執(zhí)行操作Endif去除Next關(guān)鍵字后的變量名在Next關(guān)鍵字后加上變量名會(huì)導(dǎo)致代碼的效率下降。我也不知道為什么會(huì)這樣,只是一個(gè)經(jīng)驗(yàn)而已。不過我想很少有程序員會(huì)這樣畫蛇添足,畢竟大多數(shù)程序員都是惜字如金的人。注釋:錯(cuò)誤的代碼ForiCount=1to10注釋:執(zhí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論