簡介:
本文描述了如何通過一些技術(shù)手段來提高vb代碼的執(zhí)行效率。這些手段可以分為兩個大的部分:編碼技術(shù)和編譯優(yōu)化技術(shù)。在編碼技術(shù)中介紹了如何通過使用高效的數(shù)據(jù)類型、減少外部引用等編程手段來提高代碼執(zhí)行速度,減少代碼消耗的系統(tǒng)資源。在編譯優(yōu)化技術(shù)中介紹了如何正確地利用vb提供的編譯選項對在編譯時最后生成的可執(zhí)行文件進(jìn)行優(yōu)化。
前言
什么是一個高效的軟件?一個高效的軟件不僅應(yīng)該比實現(xiàn)同樣功能的軟件運行得更快,還應(yīng)該消耗更少的系統(tǒng)資源。這篇文章匯集了作者在使用vb進(jìn)行軟件開發(fā)時積累下來的一些經(jīng)驗,通過一些簡單的例子來向你展示如何寫出高效的vb代碼。其中包含了一些可能對vb程序員非常有幫助的技術(shù)。在開始之前,先讓我陳清幾個概念。
讓代碼一次成型:在我接觸到的程序員中,有很多人喜歡先根據(jù)功能需求把代碼寫出來,然后在此基礎(chǔ)上優(yōu)化代碼。最后發(fā)現(xiàn)為了達(dá)到優(yōu)化的目的,他們不得不把代碼再重新寫一遍。所以我建議你在編寫代碼之前就需要考慮優(yōu)化問題。
把握好優(yōu)化的結(jié)果和需要花費的工作之間的關(guān)系:通常當(dāng)完成了一段代碼,你需要檢查和修改它。在檢查代碼的過程中,也許你會發(fā)現(xiàn)某些循環(huán)中的代碼效率還可以得到進(jìn)一步的改進(jìn)。在這種情況下,很多追求完美的程序員也許會立馬修改代碼。我的建議是,如果修改這段代碼會使程序的運行時間縮短一秒,你可以修改它。如果只能帶來10毫秒的性能改進(jìn),則不做任何改動。這是因為重寫一段代碼必定會引入新的錯誤,而調(diào)試新的代碼必定會花掉你一定的時間。程序員應(yīng)該在軟件性能和開發(fā)軟件需要的工作量之間找一個平衡點,而且10毫秒對于用戶來說也是一個不能體會到的差異。
在需要使用面向?qū)ο蠓椒ǖ臅r候盡量使用它;vb提供的機(jī)制不完全支持面向?qū)ο蟮脑O(shè)計和編碼,但是vb提供了簡單的類。大多數(shù)人認(rèn)為使用對象將導(dǎo)致代碼的效率降低。對于這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發(fā),軟件占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能,這一點我會在后面的例子中詳細(xì)說明。
當(dāng)你編寫vb代碼的時候,希望你能把上面幾點作為指導(dǎo)你編碼的原則。我把文章分為兩個部分:如何提高代碼的運行速度和編譯優(yōu)化。
如何提高代碼的運行速度
下面的這些方法可以幫助你提高代碼的運行速度:
1. 使用整數(shù)(integer)和長整數(shù)(long)
提高代碼運行速度最簡單的方法莫過于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將single,double和currency類型的變量替換為integer或long類型的變量,因為vb處理integer和long的能力遠(yuǎn)遠(yuǎn)高于處理其它幾種數(shù)據(jù)類型。
在大多數(shù)情況下,程序員選擇使用single或double的原因是因為它們能夠保存小數(shù)。但是小數(shù)也可以保存在integer類型的變量中。例如程序中約定有三位小數(shù),那么只需要將保存在integer變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗,使用integer和long替代single,double和currency后,代碼的運行速度可以提高將近10倍。
2. 避免使用變體
對于一個vb程序員來說,這是再明顯不過的事情了。變體類型的變量需要16個字節(jié)的空間來保存數(shù)據(jù),而一個整數(shù)(integer)只需要2個字節(jié)。通常使用變體類型的目的是為了減少設(shè)計的工作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟件經(jīng)過了嚴(yán)格設(shè)計和按照規(guī)范編碼的話,完全可以避免使用變體類型。
在這里順帶提一句,對于object對象也存在同樣的問題。請看下面的代碼:
dim fso
set fso = new scripting.filesystemobject
或
dim fso as object
set fso = new scripting.filesystemobject
上面的代碼由于在申明的時候沒有指定數(shù)據(jù)類型,在賦值時將浪費內(nèi)存和cpu時間。正確的代碼應(yīng)該象下面這樣:
dim fso as new filesystemobject
3. 盡量避免使用屬性
在平時的代碼中,最常見的比較低效的代碼就是在可以使用變量的情況下,反復(fù)使用屬性(property),尤其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會使用到的:
dim intcon as integer
for intcon = 0 to ubound(somvar())
text1.text = text1.text & vbcrlf & somevar(intcon)
本文描述了如何通過一些技術(shù)手段來提高vb代碼的執(zhí)行效率。這些手段可以分為兩個大的部分:編碼技術(shù)和編譯優(yōu)化技術(shù)。在編碼技術(shù)中介紹了如何通過使用高效的數(shù)據(jù)類型、減少外部引用等編程手段來提高代碼執(zhí)行速度,減少代碼消耗的系統(tǒng)資源。在編譯優(yōu)化技術(shù)中介紹了如何正確地利用vb提供的編譯選項對在編譯時最后生成的可執(zhí)行文件進(jìn)行優(yōu)化。
前言
什么是一個高效的軟件?一個高效的軟件不僅應(yīng)該比實現(xiàn)同樣功能的軟件運行得更快,還應(yīng)該消耗更少的系統(tǒng)資源。這篇文章匯集了作者在使用vb進(jìn)行軟件開發(fā)時積累下來的一些經(jīng)驗,通過一些簡單的例子來向你展示如何寫出高效的vb代碼。其中包含了一些可能對vb程序員非常有幫助的技術(shù)。在開始之前,先讓我陳清幾個概念。
讓代碼一次成型:在我接觸到的程序員中,有很多人喜歡先根據(jù)功能需求把代碼寫出來,然后在此基礎(chǔ)上優(yōu)化代碼。最后發(fā)現(xiàn)為了達(dá)到優(yōu)化的目的,他們不得不把代碼再重新寫一遍。所以我建議你在編寫代碼之前就需要考慮優(yōu)化問題。
把握好優(yōu)化的結(jié)果和需要花費的工作之間的關(guān)系:通常當(dāng)完成了一段代碼,你需要檢查和修改它。在檢查代碼的過程中,也許你會發(fā)現(xiàn)某些循環(huán)中的代碼效率還可以得到進(jìn)一步的改進(jìn)。在這種情況下,很多追求完美的程序員也許會立馬修改代碼。我的建議是,如果修改這段代碼會使程序的運行時間縮短一秒,你可以修改它。如果只能帶來10毫秒的性能改進(jìn),則不做任何改動。這是因為重寫一段代碼必定會引入新的錯誤,而調(diào)試新的代碼必定會花掉你一定的時間。程序員應(yīng)該在軟件性能和開發(fā)軟件需要的工作量之間找一個平衡點,而且10毫秒對于用戶來說也是一個不能體會到的差異。
在需要使用面向?qū)ο蠓椒ǖ臅r候盡量使用它;vb提供的機(jī)制不完全支持面向?qū)ο蟮脑O(shè)計和編碼,但是vb提供了簡單的類。大多數(shù)人認(rèn)為使用對象將導(dǎo)致代碼的效率降低。對于這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發(fā),軟件占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能,這一點我會在后面的例子中詳細(xì)說明。
當(dāng)你編寫vb代碼的時候,希望你能把上面幾點作為指導(dǎo)你編碼的原則。我把文章分為兩個部分:如何提高代碼的運行速度和編譯優(yōu)化。
如何提高代碼的運行速度
下面的這些方法可以幫助你提高代碼的運行速度:
1. 使用整數(shù)(integer)和長整數(shù)(long)
提高代碼運行速度最簡單的方法莫過于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將single,double和currency類型的變量替換為integer或long類型的變量,因為vb處理integer和long的能力遠(yuǎn)遠(yuǎn)高于處理其它幾種數(shù)據(jù)類型。
在大多數(shù)情況下,程序員選擇使用single或double的原因是因為它們能夠保存小數(shù)。但是小數(shù)也可以保存在integer類型的變量中。例如程序中約定有三位小數(shù),那么只需要將保存在integer變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗,使用integer和long替代single,double和currency后,代碼的運行速度可以提高將近10倍。
2. 避免使用變體
對于一個vb程序員來說,這是再明顯不過的事情了。變體類型的變量需要16個字節(jié)的空間來保存數(shù)據(jù),而一個整數(shù)(integer)只需要2個字節(jié)。通常使用變體類型的目的是為了減少設(shè)計的工作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟件經(jīng)過了嚴(yán)格設(shè)計和按照規(guī)范編碼的話,完全可以避免使用變體類型。
在這里順帶提一句,對于object對象也存在同樣的問題。請看下面的代碼:
dim fso
set fso = new scripting.filesystemobject
或
dim fso as object
set fso = new scripting.filesystemobject
上面的代碼由于在申明的時候沒有指定數(shù)據(jù)類型,在賦值時將浪費內(nèi)存和cpu時間。正確的代碼應(yīng)該象下面這樣:
dim fso as new filesystemobject
3. 盡量避免使用屬性
在平時的代碼中,最常見的比較低效的代碼就是在可以使用變量的情況下,反復(fù)使用屬性(property),尤其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會使用到的:
dim intcon as integer
for intcon = 0 to ubound(somvar())
text1.text = text1.text & vbcrlf & somevar(intcon)