版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、提高代碼的運行速度本文描述了如何通過一些技術(shù)手段來提高 VB 代碼的執(zhí)行效率。這些手段可以分為兩個大的部分:編碼技術(shù)和 編譯優(yōu)化技術(shù)。本文從編碼技術(shù)和編譯技術(shù)來討論。第一部分:編碼技術(shù)。 下面的這些方法(到現(xiàn)在為止共 27 種)可以幫助你提高代碼的運行速度:1. 使用整數(shù)(Integer)和長整數(shù)(Long) 提高代碼運行速度最簡單的方法莫過于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將Single,Double 和 Currency 類型的變量替換為Integer 或 Long 類型的變量,因為 VB 處理 Integer
2、和 Long 的能力遠遠高于處理其它幾種數(shù)據(jù)類型。下面是排 序:Long 最快 Integer . Byte . Single .Double . Currency 最慢在大多數(shù)情況下,程序員選擇使用 Single 或 Double 的原因是因為它們能夠保存小數(shù)。但是小數(shù)也可以保存 在Integer類型的變量中。例如程序中約定有三位小數(shù),那么只需要將保存在Integer變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗,使用 Integer 和 Long 替代 Single, Double 和 Currency 后,代碼的運行速度可以 提高將近 10 倍。2. 避免使用變體對于一個 VB 程
3、序員來說,這是再明顯不過的事情了。變體類型的變量需要16 個字節(jié)的空間來保存數(shù)據(jù),而一個整數(shù)(Integer)只需要2個字節(jié)。通常使用變體類型的目的是為了減少設計的工作量和代碼量,也有的程 序員圖個省事而使用它。但是如果一個軟件經(jīng)過了嚴格設計和按照規(guī)范編碼的話,完全可以避免使用變體類 型。在這里順帶提一句,對于 Object 對象也存在同樣的問題。請看下面的代碼:Dim FSOSet FSO = New Scripting.FileSystemObject或Dim FSO as objectSet FSO = New Scripting.FileSystemObject上面的代碼由于在申明的時
4、候沒有指定數(shù)據(jù)類型,在賦值時將浪費內(nèi)存和CPU 時間。正確的代碼應該象下面這樣:Dim FSO as New FileSystemObject3. 盡量避免使用屬性Property ),尤在平時的代碼中,最常見的比較低效的代碼就是在可以使用變量的情況下,反復使用屬性( 其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的 20 倍左右。下面這段代碼是很多程序員在程序中會 使用到的:Dim intCon as IntegerFor intCon = 0 to Ubound(SomVar()Text1.Text = Text1.Text & vbcrlf & SomeVar(intCon)Next
5、 intCon下面這段代碼的執(zhí)行速度是上面代碼的 20 倍。Dim intCon as IntegerDim sOutput as StringFor intCon = 0 to Ubound(SomeVar()sOutput = sOutput & vbCrlf &SomeVar(intCon)NextText1.Text = sOutput同樣地,像這樣的代碼 . . .Do Until EOF(F)Line Input #F, nextLineText1.Text = Text1.Text + nextLineLoop. . . 比下面的代碼慢得多:Do Until EOF(F)Line
6、 Input #F, nextLinebufferVar = bufferVar + nextLineLoopText1.Text = bufferVar然而,下面的代碼完成了相同的功能,而且還要快:Text1.Text = Input(F, LOF(F)如上述,幾種方法都實現(xiàn)了同樣的任務;同時,最好的算法也是最優(yōu)的。4. 盡量使用數(shù)組,避免使用集合除非你必須使用集合( Collection ),否則你應該盡量使用數(shù)組。據(jù)測試,數(shù)組的存取速度可以達到集合的100 倍。這個數(shù)字聽起來有點駭人聽聞,但是如果你考慮到集合是一個對象,你就會明白為什么差異會這么大。5. 展開小的循環(huán)體在編碼的時候,有可
7、能遇到這種情況:一個循環(huán)體只會循環(huán) 2 到 3 次,而且循環(huán)體由幾行代碼組成。在這 種情況下,你可以把循環(huán)展開。原因是循環(huán)會占用額外的 CPU 時間。但是如果循環(huán)比較復雜,你就沒有必要這樣做了。6. 避免使用很短的函數(shù)和使用小的循環(huán)體相同,調(diào)用只有幾行代碼的函數(shù)也是不經(jīng)濟的- 調(diào)用函數(shù)所花費的時間或許比執(zhí)行函數(shù)中的代碼需要更長的時間。在這種情況下,你可以把函數(shù)中的代碼拷貝到原來調(diào)用函數(shù)的地方。7. 減少對子對象的引用在 VB 中,通過使用 . 來實現(xiàn)對象的引用。例如:Form1.Text1.Text在上面的例子中,程序引用了兩個對象: Form1 和 Text1 。利用這種方法引用效率很低。但
8、遺憾的是,沒有 辦法可以避免它。程序員唯一可以做就是使用 With 或者將用另一個對象保存子對象( Text1 )。 使用 WithWith frmMain.Text1.Text = Learn VB.Alignment = 0.Tag = Its my life.BackColor = vbBlack.ForeColor = vbWhiteEnd With或者 使用另一個對象保存子對象Dim txtTextBox as TextBoxSet txtTextBox = frmMain.Text1TxtTextBox.Text = Learn VBTxtTextBox.Alignment = 0
9、TxtTextBox.Tag = Its my lifeTxtTextBox.BackColor = vbBlackTxtTextBox.ForeColor = vbWhite注意,上面提到的方法只適用于需要對一個對象的子對象進行操作的時候,下面這段代碼是不正確的:With Text1.Text = Learn VB.Alignment = 0.Tag = Its my life.BackColor = vbBlack.ForeColor = vbWhiteEnd With很不幸的是,我們常??梢栽趯嶋H的代碼中發(fā)現(xiàn)類似于上面的代碼。這樣做只會使代碼的執(zhí)行速度更慢。原因是 With 塊編譯后會形
10、成一個分枝,會增加了額外的處理工作。8. 檢查字符串是否為空大多數(shù)程序員在檢查字符串是否為空時會使用下面的方法:If Text1.Text = then 執(zhí)行操作End if很不幸,進行字符串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:If Len(Text1.Text) = 0 then 執(zhí)行操作End if9. 去除 Next 關(guān)鍵字后的變量名在 Next 關(guān)鍵字后加上變量名會導致代碼的效率下降。我也不知道為什么會這樣,只是一個經(jīng)驗而已。不過 我想很少有程序員會這樣畫蛇添足,畢竟大多數(shù)程序員都是惜字如金的人。 錯誤的代碼For iCount = 1 to 10 執(zhí)行
11、操作Next iCount 正確的代碼For iCount = 1 to 10 執(zhí)行操作Next10. 使用數(shù)組,而不是多個變量當你有多個保存類似數(shù)據(jù)的變量時 ,可以考慮將他們用一個數(shù)組代替。在VB 中,數(shù)組是最高效的數(shù)據(jù)結(jié)構(gòu)之一。11. 使用動態(tài)數(shù)組,而不是靜態(tài)數(shù)組使用動態(tài)數(shù)組對代碼的執(zhí)行速度不會產(chǎn)生太大的影響,但是在某些情況下可以節(jié)約大量的資源。12. 銷毀對象無論編寫的是什么軟件,程序員都需要考慮在用戶決定終止軟件運行后釋放軟件占用的內(nèi)存空間。但遺憾 的是很多程序員對這一點好像并不是很在意。正確的做法是在退出程序前需要銷毀程序中使用的對象。例如:Dim FSO as New FileSy
12、stemObject 執(zhí)行操作 銷毀對象Set FSO = Nothing 對于窗體,可以進行卸載:Unload frmMain或Set frmMain = Nothing13. 變長和定長字符串從技術(shù)上來說,與變長字符串相比,定長字符串需要較少的處理時間和空間。但是定長字符串的缺點在于 在很多情況下,你都需要調(diào)用 Trim 函數(shù)以去除字符串末的空字符,這樣反而會降低代碼效率。所以除非是字符 串的長度不會變化,否則還是使用變長字符串。14. 使用類模塊,而不是 ActiveX 控件除非 ActiveX 控件涉及到用戶界面,否則盡量使用輕量的對象,例如類。這兩者之間的效率有很大差異。15. 使用
13、內(nèi)部對象在涉及到使用 ActiveX 控件和 DLL 的時候,很多程序員喜歡將它們編譯好,然后再加入工程中。我建議你 最好不要這樣做,因為從 VB 連接到一個外部對象需要耗費大量的 CPU 處理能力。每當你調(diào)用方法或存取屬性 的時候,都會浪費大量的系統(tǒng)資源。如果你有 ActiveX 控件或 DLL 的源代碼,將它們作為工程的私有對象。16. 減少模塊的數(shù)量 有些人喜歡將通用的函數(shù)保存在模塊中,對于這一點我表示贊同。但是在一個模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使用它。這樣做的原因是因為只有在模塊中的函數(shù)或變量 被調(diào)用時, VB 才將模塊加載到內(nèi)存中;當 VB
14、應用程序退出時,才會從內(nèi)存中卸載這些模塊。如果代碼中只有 一個模塊, VB 就只會進行一次加載操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個模塊, VB 會 進行多次加載操作,代碼的效率會降低。17. 使用對象數(shù)組當設計用戶界面時,對于同樣類型的控件,程序員應該盡量使用對象數(shù)組。你可以做一個實驗:在窗口上 添加 100 個 PictureBox ,每個 PictureBox 都有不同的名稱,運行程序。然后創(chuàng)建一個新的工程,同樣在窗口上添 加 100 個 PictureBox ,不過這一次使用對象數(shù)組,運行程序,你可以注意到兩個程序加載時間上的差別。18. 使用 Move 方法在改變對象
15、的位置時,有些程序員喜歡使用Width , Height, Top和Left屬性。例如:Image1.Width = 100Image1.Height = 100Image1.Top = 0Image1.Left = 0實際上這樣做效率很低,因為程序修改了四個屬性,而且每次修改之后,窗口都會被重繪。正確的做法是使用 Move 方法:Image1.Move 0,0,100,10019. 減少圖片的使用圖片將占用大量內(nèi)存,而且處理圖片也需要占用很多 CPU 資源。在軟件中,如果可能的話,可以考慮用背 景色來替代圖片 - 當然這只是從技術(shù)人員的角度出發(fā)看這個問題。20. 使用 ActiveX DLL
16、 ,而不是 ActiveX 控件如果你設計的 ActiveX 對象不涉及到用戶界面,使用 ActiveX DLL 。21. 使用類可以提高軟件的整體性能VB 提供的機制不完全支持面向?qū)ο蟮脑O計和編碼,但是 VB 提供了簡單的類。大多數(shù)人認為使用對象將導致 代碼的效率降低。對于這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發(fā),軟件 占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能。22. 盡可能使用常數(shù) 使用常數(shù)可以加快應用程序的運行,增強代碼的可讀性,而且易于維護。如果代碼中的字符串或數(shù)字是不變 的,則可把它們聲明為常數(shù)。常數(shù)在編譯時只處理一次,將
17、適當?shù)闹祵戇M代碼;而變量在每次運行應用程序時 都要讀取當前值。盡量使用對象瀏覽器中列舉的內(nèi)部常數(shù),而不要自己去創(chuàng)建。不要擔心應用程序中引用的模塊包含多余的常 數(shù);多余的常數(shù)在形成 .exe 文件時被刪除。23. 用 ByVal 傳遞參數(shù),而不用 ByRef編寫含參數(shù)的 Sub 或 Function 過程時,按值 (ByVal) 傳遞參數(shù)比按地址 (ByRef) 快。盡管 Visual Basic 中參數(shù)傳 遞的缺省方式是按地址的 (ByRef) ,但實際上需要改變參數(shù)值的過程極少。如果過程中不需改變參數(shù)的值,就可 以按值 (ByVal) 來傳遞,舉例說明如下:Private Sub DoSom
18、ething(ByVal strName As String, _ByVal intAge As Integer)24. 使用類型確定的可選參數(shù)使用 Visual Basic 5.0 中類型確定的可選參數(shù),可以提高 Sub 或 Function 的調(diào)用速度。 Visual Basic 以前版本中的 可選參數(shù)只能是 Variant 的。如果過程是按值傳遞參數(shù)的,正如下面的例子, 16 個字節(jié)的 Variant 變量保存在堆 棧中。Private Sub DoSomething(ByVal strName As String, _Optional ByVal vntAge As Variant,
19、_Optional ByVal vntWeight As Variant)使用類型確定的可選參數(shù),每次調(diào)用時占用的堆??臻g較少,而且傳遞到內(nèi)存中的數(shù)據(jù)也較少:Private Sub DoSomething(ByVal strName As String, _ Optional ByVal intAge As Integer, _Optional ByVal intWeight As Integer)類型確定的可選參數(shù)的訪問速度比 Variant 快,而且一旦數(shù)據(jù)類型錯誤,編譯時就顯示錯誤信息25 利用集合的優(yōu)點可以定義和使用對象的集合是 Visual Basic 的強大功能之一。盡管集合是非常
20、有用的,但還要正確使用才能獲得 最好的效果:使用 For Each.Next 替代 For.Next 。26. 添加集合的對象時避免使用 Before 和 After 參數(shù)。使用鍵集而不用幾組相同對象的數(shù)組。集合可以用 For.Next 循環(huán)進行迭代。但采用 For Each.Next 可讀性 更好,而且多數(shù)情況下更快。 For Each.Next 是由集合的生成器實現(xiàn)迭 代的,所以實際的 操作速度將隨集合對象的不同而改變。由 于 For Each.Next 的最簡單的實現(xiàn)機理就是 For.Next 的線性迭代,因此 For Each.Next 不會比 For.Next 慢。但 是,有些情況下
21、采用了比線性迭代更復雜的實現(xiàn)機理,所以For Each.Next 要快得多。如果沒有使用 Before 和 After 參數(shù),則往集合中添加對象是非??斓摹7駝t, Visual Basic 必須在集合中檢測到 其它對象后,才能添加新對象。如果對象的類型都一樣,集合或數(shù)組都可以用來管理這些對象(如果對象的類型不一樣,則只能用集合)。從 速度的觀點看,選擇何種方式取決于對象的訪問方式。如果能夠為每一對象分配唯一的鍵,則集合是訪問對象 的最快方式。使用鍵從集合中檢索對象比從數(shù)組中順序遍歷對象快。當然,如果沒有鍵而要遍歷對象時,則選 擇數(shù)組比較好。就順序遍歷方式而言,數(shù)組比集合快。如果對象的個數(shù)少,則
22、數(shù)組使用的內(nèi)存小,并且搜索的速度快。當對象的個數(shù)在 100 左右時,集合比數(shù)組的效 率高;當然,具體的數(shù)目還有賴于微處理器的速度和可用的內(nèi)存。26. 不要用 Do While Not record.EOF 語句。例如下面的代碼比較慢:Do While Not record.EOF 代碼record.MoveNextLoop下面的要快好多Record.MoveLastintCount=Record.RecordCountRecord.MoveFirstFor i=1 To intCount 代碼Records.MoveNextNext i第二部分 編譯優(yōu)化我所見過的很多 VB 程序員從來沒有使用
23、過編譯選項,也沒有試圖搞清楚各個選項之間的差別。下面讓我 們來看一下各個選項的具體含義。1. P-代碼(偽代碼)和本機代碼你可以選擇將軟件編譯為 P-代碼或是本機代碼。缺省選項是本機代碼。那什么是P-代碼和本機代碼呢?P-代碼:當在VB中執(zhí)行代碼時,VB首先是將代碼編譯為 P-代碼,然后再解釋執(zhí)行編譯好的P-代碼。在編譯環(huán)境下,使用這種代碼要比本機代碼快。選擇PH弋碼后,編譯時 VB將偽代碼放入一個 EXE文件中。本機代碼:本機代碼是VB6以后才推出的選項。當編譯為EXE文件后,本機代碼的執(zhí)行速度比P-代碼快。選擇本機代碼后,編譯時 VB 使用機器指令生成 EXE 文件。在使用本機代碼進行編譯
24、時,我發(fā)現(xiàn)有時候會引入一些莫名其妙的錯誤。在編譯環(huán)境中我的代碼完全正確 地被執(zhí)行了,但是用本機代碼選項生成的 EXE 文件卻不能正確執(zhí)行。通常這種情況是在卸載窗口或彈出打印窗 口時發(fā)生的。我通過在代碼中加入 DoEvent 語句解決了這個問題。當然出現(xiàn)這種情況的幾率非常少,也許有些 VB 程序員從來沒有遇到過,但是它的確存在。在本機代碼中還有幾個選項:a) 代碼速度優(yōu)化:該選項可以編譯出速度較快的執(zhí)行文件,但執(zhí)行文件比較大。推薦使用b) 代碼大小優(yōu)化:該選項可以編譯出比較小的執(zhí)行文件,但是以犧牲速度為代價的,不推薦使用。c) 無優(yōu)化:該選項只是將 P-代碼轉(zhuǎn)化為本機代碼,沒有做任何優(yōu)化。在調(diào)試代碼時可以使用。d) 針對 Pentium Pro
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工月工作計劃集合十篇
- 師范生的實習報告范文合集7篇
- 主題班會演講稿(15篇)
- 計算機維修工標準
- 管理的決策職能名詞解釋1決策2程序化決策3非程序化
- 2024年電力施工安全規(guī)范合作合同版B版
- 川教版(2019)小學信息技三年級上冊第三單元第3節(jié)《變換造型》教學實錄及反思
- 《天宮課堂》第二課觀后感簡短七篇
- 八年級歷史下冊 第一學習主題 中華人民共和國的成立和鞏固 第1課 中國人民站起來了教學實錄2 川教版
- 學校辦公室主任述職報告【7篇】
- 工會新聞的寫作培訓講義(共36頁).ppt
- 小學贛美版六年級美術(shù)上冊第二十課向往和平課件(16張)ppt課件
- 中藥飲片購進驗收記錄表格模板
- TCM遠紅外發(fā)展初析
- 滑坡穩(wěn)定性計算及滑坡推力計算
- 繼教脈圖分析 0
- 房地產(chǎn)開發(fā)企業(yè)土地增值稅清算政策與實務操作(成都市)解讀
- 房地產(chǎn)估計第九章假設開發(fā)法練習題參考答案
- [爆笑小品校園劇本7人]爆笑小品校園劇本
- 第五章 逆向選擇
- 高速鐵路電氣化系統(tǒng)概論PPT優(yōu)秀課件
評論
0/150
提交評論