vb6編譯本機代碼和p代碼
『壹』 vb編譯為「本機代碼」和「P-代碼」有什麼不同
按照預設規定,Visual Basic 將應用程序編譯成可運行的解釋型或 P-code 程序。運行時,動態鏈接庫 (DLL) 將翻譯或解釋執行程序中的指令。
用「本機代碼」選項來編譯工程意味著您寫的代碼將完整地編譯為處理器晶元的本地指令,而不是編譯為p-code。這將大大加速循環和數學計算,並可以加速對 MSVBVM60.DLL提供的服務程序的調用。然而,這並不能減少對 DLL 的需要。
選中「編譯為P-代碼」,VB將應用程序編譯成解釋執行的P-代碼程序。運行P-代碼程序時,動態鏈接庫(DLL)將翻譯或解釋執行程序中的指令。在許多情況下,運行本機代碼比運行解釋型代碼本質上要快得多。
P代碼似乎沒什麼優點喔,我唯一知道的就是編譯為P代碼較難破解。
Microsoft Visual Basic 6.0是一個RAD(Rapid Application Development)工具,它具有把應用程序編譯成P代碼或本機代碼的靈活性。把應用程序編譯成P代碼可以使代碼的長度被優化為最小。這種代碼長度較 小的特點使P代碼在低帶寬情況下成為創建Internet應用程序的最佳選擇。本機代碼的編譯過程對速度進行了很好的優化(將快至20倍),但是所產生的 可執行文件長度變大。Visual Basic 6.0是既支持通過P代碼又支持通過本機代碼快速開發應用程序的唯一RAD工具。
p代碼運行可能要慢一些,但是兼容性較好、文件小,發布時建議使用P代碼
這條意見 好像不對哦。
兩種都應該要vb運行庫的,一個要的是速度,一個要的是文件大小。
按照默認規定,Visual Basic將應用程序編譯成可運行的解釋型或P代碼(P-Code)程序。運行時,動態鏈接庫(DLL)將翻譯或解釋執行程序中的指令。在許多情況下,運行本機代碼比運行解釋型代碼本質上要快的多。
編譯為本機代碼時應注意以下一些事項:
1、若代碼做了大量固定類型的、非字元串變數的基本操作,則其產生的本機代碼將比編譯的P-Code操作碼產生最大的反差。但是,對於復雜的經濟計算或生成分形圖形,用本機代碼有很多好處。
2、計算密集型程序或在局部數據結構中處理大量的位和位元組操作的程序,用本機代碼就可獲得明顯的好處。
3、在多數的程序中,特別是那些含有大量Windows Api調用、COM方法調用和字元串操作的程序中,本機代碼不比P-Code快多少。
4、含有大量子常式調用而非內嵌過程的代碼,用本機代碼也不是很快。
『貳』 如何編寫高質量的VB代碼
1. 使用整數(Integer)和長整數(Long)
提高代碼運行速度最簡單的方法莫過於使用正確的數據類型了。也許你不相信,但是正確地選擇數據類型可以大幅度提升代碼的性能。在大多數情況下,程序員可以將Single,Double和Currency類型的變數替換為Integer或Long類型的變數,因為VB處理Integer和Long的能力遠遠高於處理其它幾種數據類型。
在大多數情況下,程序員選擇使用Single或Double的原因是因為它們能夠保存小數。但是小數也可以保存在Integer類型的變數中。例如程序中約定有三位小數,那麼只需要將保存在Integer變數中的數值除以1000就可以得到結果。根據我的經驗,使用Integer和Long替代Single,Double和Currency後,代碼的運行速度可以提高將近10倍。
2. 避免使用變體
對於一個VB程序員來說,這是再明顯不過的事情了。變體類型的變數需要16個位元組的空間來保存數據,而一個整數(Integer)只需要2個位元組。通常使用變體類型的目的是為了減少設計的工4作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟體經過了嚴格設計和按照規范編碼的話,完全可以避免使用變體類型。
在這里順帶提一句,對於Object對象也存在同樣的問題。請看下面的代碼:
Dim FSO
Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object
Set FSO = New Scripting.FileSystemObject
上面的代碼由於在申明的時候沒有指定數據類型,在賦值時將浪費內存和CPU時間。正確的代碼應該象下面這樣:
Dim FSO as New FileSystemObject
3. 盡量避免使用屬性
在平時的代碼中,最常見的比較低效的代碼就是在可以使用變數的情況下,反復使用屬性(Property),尤其是在循環中。要知道存取變數的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會使用到的:
Dim intCon as Integer
For intCon = 0 to Ubound(SomVar())
Text1.Text = Text1.Text & vbcrlf & SomeVar(intCon)
Next intCon
下面這段代碼的執行速度是上面代碼的20倍。
Dim intCon as Integer
Dim sOutput as String
For intCon = 0 to Ubound(SomeVar())
sOutput = sOutput & vbCrlf &
SomeVar(intCon)
Next
Text1.Text = sOutput
4. 盡量使用數組,避免使用集合
除非你必須使用集合(Collection),否則你應該盡量使用數組。據測試,數組的存取速度可以達到集合的100倍。這個數字聽起來有點駭人聽聞,但是如果你考慮到集合是一個對象,你就會明白為什麼差異會這么大。
5. 展開小的循環體
在編碼的時候,有可能遇到這種情況:一個循環體只會循環2到3次,而且循環體由幾行代碼組成。在這種情況下,你可以把循環展開。原因是循環會佔用額外的CPU時間。但是如果循環比較復雜,你就沒有必要這樣做了。
6. 避免使用很短的函數
和使用小的循環體相同,調用只有幾行代碼的函數也是不經濟的--調用函數所花費的時間或許比執行函數中的代碼需要更長的時間。在這種情況下,你可以把函數中的代碼拷貝到原來調用函數的地方。
7. 減少對子對象的引用
在VB中,通過使用.來實現對象的引用。例如:
Form1.Text1.Text
在上面的例子中,程序引用了兩個對象:Form1和Text1。利用這種方法引用效率很低。但遺憾的是,沒有辦法可以避免它。程序員唯一可以做就是使用With或者將用另一個對象保存子對象(Text1)。
注釋: 使用With
With frmMain.Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
或者
注釋: 使用另一個對象保存子對象
Dim txtTextBox as TextBox
Set txtTextBox = frmMain.Text1
TxtTextBox.Text = "Learn VB"
TxtTextBox.Alignment = 0
TxtTextBox.Tag = "Its my life"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite 注意,上面提到的方法只適用於需要對一個對象的子對象進行操作的時候,下面這段代碼是不正確的:
With Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸的是,我們常常可以在實際的代碼中發現類似於上面的代碼。這樣做只會使代碼的執行速度更慢。原因是With塊編譯後會形成一個分枝,會增加了額外的處理工作。
8. 檢查字元串是否為空
大多數程序員在檢查字元串是否為空時會使用下面的方法:
If Text1.Text = "" then
注釋: 執行操作
End if
很不幸,進行字元串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:
If Len(Text1.Text) = 0 then
注釋: 執行操作
End if
9. 去除Next關鍵字後的變數名
在Next關鍵字後加上變數名會導致代碼的效率下降。我也不知道為什麼會這樣,只是一個經驗而已。不過我想很少有程序員會這樣畫蛇添足,畢竟大多數程序員都是惜字如金的人。
注釋: 錯誤的代碼
For iCount = 1 to 10
注釋: 執行操作
Next iCount
注釋: 正確的代碼
For iCount = 1 to 10
注釋: 執行操作
Next
10. 使用數組,而不是多個變數
當你有多個保存類似數據的變數時,可以考慮將他們用一個數組代替。在VB中,數組是最高效的數據結構之一。
11. 使用動態數組,而不是靜態數組
使用動態數組對代碼的執行速度不會產生太大的影響,但是在某些情況下可以節約大量的資源。
12. 銷毀對象
無論編寫的是什麼軟體,程序員都需要考慮在用戶決定終止軟體運行後釋放軟體佔用的內存空間。但遺憾的是很多程序員對這一點好像並不是很在意。正確的做法是在退出程序前需要銷毀程序中使用的對象。例如:
Dim FSO as New FileSystemObject
' 執行操作
' 銷毀對象
Set FSO = Nothing
對於窗體,可以進行卸載:
Unload frmMain
或
Set frmMain = Nothing
13. 變長和定長字元串
從技術上來說,與變長字元串相比,定長字元串需要較少的處理時間和空間。但是定長字元串的缺點在於在很多情況下,你都需要調用Trim函數以去除字元串末的空字元,這樣反而會降低代碼效率。所以除非是字元串的長度不會變化,否則還是使用變長字元串。
14. 使用類模塊,而不是ActiveX控制項
除非ActiveX控制項涉及到用戶界面,否則盡量使用輕量的對象,例如類。這兩者之間的效率有很大差異。
15. 使用內部對象
在涉及到使用ActiveX控制項和DLL的時候,很多程序員喜歡將它們編譯好,然後再加入工程中。我建議你最好不要這樣做,因為從VB連接到一個外部對象需要耗費大量的CPU處理能力。每當你調用方法或存取屬性的時候,都會浪費大量的系統資源。如果你有ActiveX控制項或DLL的源代碼,將它們作為工程的私有對象。
16. 減少模塊的數量
有些人喜歡將通用的函數保存在模塊中,對於這一點我表示贊同。但是在一個模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使用它。這樣做的原因是因為只有在模塊中的函數或變數被調用時,VB才將模塊載入到內存中;當VB應用程序退出時,才會從內存中卸載這些模塊。如果代碼中只有一個模塊,VB就只會進行一次載入操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個模塊,VB會進行多次載入操作,代碼的效率會降低。
17. 使用對象數組
當設計用戶界面時,對於同樣類型的控制項,程序員應該盡量使用對象數組。你可以做一個實驗:在窗口上添加100個PictureBox,每個PictureBox都有不同的名稱,運行程序。然後創建一個新的工程,同樣在窗口上添加100個PictureBox,不過這一次使用對象數組,運行程序,你可以注意到兩個程序載入時間上的差別。
18. 使用Move方法
在改變對象的位置時,有些程序員喜歡使用Width,Height,Top和Left屬性。例如:
Image1.Width = 100
Image1.Height = 100
Image1.Top = 0
Image1.Left = 0
實際上這樣做效率很低,因為程序修改了四個屬性,而且每次修改之後,窗口都會被重繪。正確的做法是使用Move方法:
Image1.Move 0,0,100,100
19. 減少圖片的使用
圖片將佔用大量內存,而且處理圖片也需要佔用很多CPU資源。在軟體中,如果可能的話,可以考慮用背景色來替代圖片--當然這只是從技術人員的角度出發看這個問題。
20. 使用ActiveX DLL,而不是ActiveX控制項
如果你設計的ActiveX對象不涉及到用戶界面,使用ActiveX DLL。
編譯優化
我所見過的很多VB程序員從來沒有使用過編譯選項,也沒有試圖搞清楚各個選項之間的差別。下面讓我們來看一下各個選項的具體含義。
1. P-代碼(偽代碼)和本機代碼
你可以選擇將軟體編譯為P-代碼或是本機代碼。預設選項是本機代碼。那什麼是P-代碼和本機代碼呢?
P-代碼:當在VB中執行代碼時,VB首先是將代碼編譯為P-代碼,然後再解釋執行編譯好的P-代碼。在編譯環境下,使用這種代碼要比本機代碼快。選擇P-代碼後,編譯時VB將偽代碼放入一個EXE文件中。
本機代碼:本機代碼是VB6以後才推出的選項。當編譯為EXE文件後,本機代碼的執行速度比P-代碼快。選擇本機代碼後,編譯時VB使用機器指令生成EXE文件。
在使用本機代碼進行編譯時,我發現有時候會引入一些莫名其妙的錯誤。在編譯環境中我的代碼完全正確地被執行了,但是用本機代碼選項生成的EXE文件卻不能正確執行。通常這種情況是在卸載窗口或彈出列印窗口時發生的。我通過在代碼中加入DoEvent語句解決了這個問題。當然出現這種情況的幾率非常少,也許有些VB程序員從來沒有遇到過,但是它的確存在。
在本機代碼中還有幾個選項:
a) 代碼速度優化:該選項可以編譯出速度較快的執行文件,但執行文件比較大。推薦使用
b) 代碼大小優化:該選項可以編譯出比較小的執行文件,但是以犧牲速度為代價的,不推薦使用。
c) 無優化:該選項只是將P-代碼轉化為本機代碼,沒有做任何優化。在調試代碼時可以使用。
d) 針對Pentium Pro優化:雖然該項不是本機代碼中的預設選項,但是我通常會使用該選項。該選項編譯出的可執行程序在Pentium Pro和Pentium 2以上的機器上可以運行得更快,而在比較老的機器上要稍稍慢一些。考慮到現在用Pentium 2都是落伍,所以推薦大家使用該選項。
e) 產生符號化調試信息:該項在編譯過程中生成一些調試信息,使用戶可以利用Visual C++一類的工具來調試編譯好的代碼。使用該選項會生成一個.pdf文件,該文件記錄了可執行文件中的標志信息。當程序擁有API函數或DLL調用時,該選項還是比較有幫助的。
2. 高級優化
高級優化中的設置可以幫助你提高軟體的速度,但是有時候也會引入一些錯誤,因此我建議大家盡量小心地使用它們。如果在代碼中有比較大的循環體或者復雜的數學運算時,選中高級優化中的某些項會大幅度提升代碼的性能。如果你使用了高級優化功能,我建議你嚴格測試編譯好的文件。
a) 假定無別名:可以提高循環體中代碼的執行效率,但是在如果通過變數的引用改變變數值的情況下,例如調用一個方法,變數的引用作為方法的參數,在方法中改變了變數的值的話,就會引發錯誤。有可能只是返回的結果錯誤,也有可能是導致程序中斷運行的嚴重錯誤。
b) 取消數組綁定檢查、取消整數溢出檢查和取消浮點錯誤檢查:在程序運行時,如果通過這些檢查發現了錯誤,錯誤處理代碼會處理這些錯誤。但是如果取消了這些檢查,發生了錯誤程序就無法處理。只有當你確定你的代碼中不會出現上面的這些錯誤時,你才可以使用這些選項。它們將使軟體的性能得到很大的提升。
c) 允許不舍入的浮點操作:選擇該選項可以是編譯出來的程序更快地處理浮點操作。它唯一的缺點就是在比較兩個浮點數時可能會導致不正確的結果。
d) 取消Pentium FDIV安全檢查:該選項是針對一些老的Pentium晶元設置的,現在看來已經過時了。
『叄』 VB編譯為P-代碼是什麼意思
p代碼:全稱是pseudo-code,就是偽代碼的意思,在VB編譯中,有兩種編譯方式,一種是Native-Code(本地代碼),另一種就是p-code。P-code 或偽代碼,是介於 Basic 程序中的高級指令和計算機處理器執行的低級本機代碼之間的一種中間步驟。
無論選擇哪個,都需要運行庫,不過自WINXP以後版本都有自帶VB6運行庫的。
雖然VBGOOD等論壇已經有牛人使用VB6寫成機器+匯編代碼,脫離運行庫,但是,程序會變得臃腫,原理就是將運行庫集成自身或者全部使用API函數。
『肆』 vb編譯時本機代碼和P代碼有什麼不同
P代碼是VB程序生成的偽代碼,可講是一種解釋型的代碼,如果你用VB的反編譯程序,則有可能把那個VB程序反編譯出代碼,不過P代碼在資料庫的方面上效率並不比本機代碼的低,而用本機代碼方式生成的EXE則可算是真正的EXE吧.....代碼執行的效率比較高......一般來說用的都是本機代碼.
『伍』 VB 請問高手,如何讓 VB 運行的速度快
:
1. 使用整數(Integer)和長整數(Long)
提高代碼運行速度最簡單的方法莫過於使用正確的數據類型了。也許你不相信,但是正確地選擇數據類型可以大幅度提升代碼的性能。在大多數情況下,程序員可以將Single,Double和Currency類型的變數替換為Integer或Long類型的變數,因為VB處理Integer和Long的能力遠遠高於處理其它幾種數據類型。下面是排序:
Long 最快
Integer .
Byte .
Single .
Double .
Currency 最慢
在大多數情況下,程序員選擇使用Single或Double的原因是因為它們能夠保存小數。但是小數也可以保存在Integer類型的變數中。例如程序中約定有三位小數,那麼只需要將保存在Integer變數中的數值除以1000就可以得到結果。根據我的經驗,使用Integer和Long替代Single,Double和Currency後,代碼的運行速度可以提高將近10倍。
2. 避免使用變體
對於一個VB程序員來說,這是再明顯不過的事情了。變體類型的變數需要16個位元組的空間來保存數據,而一個整數(Integer)只需要2個位元組。通常使用變體類型的目的是為了減少設計的工作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟體經過了嚴格設計和按照規范編碼的話,完全可以避免使用變體類型。
在這里順帶提一句,對於Object對象也存在同樣的問題。請看下面的代碼:
Dim FSO
Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object
Set FSO = New Scripting.FileSystemObject
上面的代碼由於在申明的時候沒有指定數據類型,在賦值時將浪費內存和CPU時間。正確的代碼應該象下面這樣:
Dim FSO as New FileSystemObject
3. 盡量避免使用屬性
在平時的代碼中,最常見的比較低效的代碼就是在可以使用變數的情況下,反復使用屬性(Property),尤其是在循環中。要知道存取變數的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會使用到的:
Dim intCon as Integer
For intCon = 0 to Ubound(SomVar())
Text1.Text = Text1.Text & vbcrlf & SomeVar(intCon)
Next intCon
下面這段代碼的執行速度是上面代碼的20倍。
Dim intCon as Integer
Dim sOutput as String
For intCon = 0 to Ubound(SomeVar())
sOutput = sOutput & vbCrlf &
SomeVar(intCon)
Next
Text1.Text = sOutput
同樣地,像這樣的代碼 . . .
Do Until EOF(F)
Line Input #F, nextLine
Text1.Text = Text1.Text + nextLine
Loop
. . . 比下面的代碼慢得多:
Do Until EOF(F)
Line Input #F, nextLine
bufferVar = bufferVar + nextLine
Loop
Text1.Text = bufferVar
然而,下面的代碼完成了相同的功能,而且還要快:
Text1.Text = Input(F, LOF(F))
如上述,幾種方法都實現了同樣的任務;同時,最好的演算法也是最優的。
4. 盡量使用數組,避免使用集合
除非你必須使用集合(Collection),否則你應該盡量使用數組。據測試,數組的存取速度可以達到集合的100倍。這個數字聽起來有點駭人聽聞,但是如果你考慮到集合是一個對象,你就會明白為什麼差異會這么大。
5. 展開小的循環體
在編碼的時候,有可能遇到這種情況:一個循環體只會循環2到3次,而且循環體由幾行代碼組成。在這種情況下,你可以把循環展開。原因是循環會佔用額外的CPU時間。但是如果循環比較復雜,你就沒有必要這樣做了。
6. 避免使用很短的函數
和使用小的循環體相同,調用只有幾行代碼的函數也是不經濟的--調用函數所花費的時間或許比執行函數中的代碼需要更長的時間。在這種情況下,你可以把函數中的代碼拷貝到原來調用函數的地方。
7. 減少對子對象的引用
在VB中,通過使用.來實現對象的引用。例如:
Form1.Text1.Text
在上面的例子中,程序引用了兩個對象:Form1和Text1。利用這種方法引用效率很低。但遺憾的是,沒有辦法可以避免它。程序員唯一可以做就是使用With或者將用另一個對象保存子對象(Text1)。
' 使用With
With frmMain.Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
或者
' 使用另一個對象保存子對象
Dim txtTextBox as TextBox
Set txtTextBox = frmMain.Text1
TxtTextBox.Text = "Learn VB"
TxtTextBox.Alignment = 0
TxtTextBox.Tag = "Its my life"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite
注意,上面提到的方法只適用於需要對一個對象的子對象進行操作的時候,下面這段代碼是不正確的:
With Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸的是,我們常常可以在實際的代碼中發現類似於上面的代碼。這樣做只會使代碼的執行速度更慢。原因是With塊編譯後會形成一個分枝,會增加了額外的處理工作。
8. 檢查字元串是否為空
大多數程序員在檢查字元串是否為空時會使用下面的方法:
If Text1.Text = "" then
' 執行操作
End if
很不幸,進行字元串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:
If Len(Text1.Text) = 0 then
' 執行操作
End if
9. 去除Next關鍵字後的變數名
在Next關鍵字後加上變數名會導致代碼的效率下降。我也不知道為什麼會這樣,只是一個經驗而已。不過我想很少有程序員會這樣畫蛇添足,畢竟大多數程序員都是惜字如金的人。
' 錯誤的代碼
For iCount = 1 to 10
' 執行操作
Next iCount
' 正確的代碼
For iCount = 1 to 10
' 執行操作
Next
10. 使用數組,而不是多個變數
當你有多個保存類似數據的變數時,可以考慮將他們用一個數組代替。在VB中,數組是最高效的數據結構之一。
11. 使用動態數組,而不是靜態數組
使用動態數組對代碼的執行速度不會產生太大的影響,但是在某些情況下可以節約大量的資源。
12. 銷毀對象
無論編寫的是什麼軟體,程序員都需要考慮在用戶決定終止軟體運行後釋放軟體佔用的內存空間。但遺憾的是很多程序員對這一點好像並不是很在意。正確的做法是在退出程序前需要銷毀程序中使用的對象。例如:
Dim FSO as New FileSystemObject
' 執行操作
' 銷毀對象
Set FSO = Nothing
對於窗體,可以進行卸載:
Unload frmMain
或
Set frmMain = Nothing
13. 變長和定長字元串
從技術上來說,與變長字元串相比,定長字元串需要較少的處理時間和空間。但是定長字元串的缺點在於在很多情況下,你都需要調用Trim函數以去除字元串末的空字元,這樣反而會降低代碼效率。所以除非是字元串的長度不會變化,否則還是使用變長字元串。
14. 使用類模塊,而不是ActiveX控制項
除非ActiveX控制項涉及到用戶界面,否則盡量使用輕量的對象,例如類。這兩者之間的效率有很大差異。
15. 使用內部對象
在涉及到使用ActiveX控制項和DLL的時候,很多程序員喜歡將它們編譯好,然後再加入工程中。我建議你最好不要這樣做,因為從VB連接到一個外部對象需要耗費大量的CPU處理能力。每當你調用方法或存取屬性的時候,都會浪費大量的系統資源。如果你有ActiveX控制項或DLL的源代碼,將它們作為工程的私有對象。
16. 減少模塊的數量
有些人喜歡將通用的函數保存在模塊中,對於這一點我表示贊同。但是在一個模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使用它。這樣做的原因是因為只有在模塊中的函數或變數被調用時,VB才將模塊載入到內存中;當VB應用程序退出時,才會從內存中卸載這些模塊。如果代碼中只有一個模塊,VB就只會進行一次載入操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個模塊,VB會進行多次載入操作,代碼的效率會降低。
17. 使用對象數組
當設計用戶界面時,對於同樣類型的控制項,程序員應該盡量使用對象數組。你可以做一個實驗:在窗口上添加100個PictureBox,每個PictureBox都有不同的名稱,運行程序。然後創建一個新的工程,同樣在窗口上添加100個PictureBox,不過這一次使用對象數組,運行程序,你可以注意到兩個程序載入時間上的差別。
18. 使用Move方法
在改變對象的位置時,有些程序員喜歡使用Width,Height,Top和Left屬性。例如:
Image1.Width = 100
Image1.Height = 100
Image1.Top = 0
Image1.Left = 0
實際上這樣做效率很低,因為程序修改了四個屬性,而且每次修改之後,窗口都會被重繪。正確的做法是使用Move方法:
Image1.Move 0,0,100,100
19. 減少圖片的使用
圖片將佔用大量內存,而且處理圖片也需要佔用很多CPU資源。在軟體中,如果可能的話,可以考慮用背景色來替代圖片--當然這只是從技術人員的角度出發看這個問題。
20. 使用ActiveX DLL,而不是ActiveX控制項
如果你設計的ActiveX對象不涉及到用戶界面,使用ActiveX DLL。
21. 使用類可以提高軟體的整體性能
VB提供的機制不完全支持面向對象的設計和編碼,但是VB提供了簡單的類。大多數人認為使用對象將導致代碼的效率降低。對於這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發,軟體佔用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟體的性能。
22. 盡可能使用常數
使用常數可以加快應用程序的運行,增強代碼的可讀性,而且易於維護。如果代碼中的字元串或數字是不變的,則可把它們聲明為常數。常數在編譯時只處理一次,將適當的值寫進代碼;而變數在每次運行應用程序時都要讀取當前值。
盡量使用對象瀏覽器中列舉的內部常數,而不要自己去創建。不要擔心應用程序中引用的模塊包含多餘的常數;多餘的常數在形成 .exe 文件時被刪除。
23. 用 ByVal 傳遞參數,而不用 ByRef
編寫含參數的 Sub 或 Function 過程時,按值 (ByVal) 傳遞參數比按地址 (ByRef) 快。盡管 Visual Basic 中參數傳遞的預設方式是按地址的 (ByRef) ,但實際上需要改變參數值的過程極少。如果過程中不需改變參數的值,就可以按值 (ByVal) 來傳遞,舉例說明如下:
Private Sub DoSomething(ByVal strName As String, _
ByVal intAge As Integer)
24. 使用類型確定的可選參數
使用 Visual Basic 5.0 中類型確定的可選參數,可以提高 Sub 或 Function 的調用速度。Visual Basic 以前版本中的可選參數只能是 Variant 的。如果過程是按值傳遞參數的,正如下面的例子,16 個位元組的 Variant 變數保存在堆棧中。
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal vntAge As Variant, _
Optional ByVal vntWeight As Variant)
使用類型確定的可選參數,每次調用時佔用的堆棧空間較少,而且傳遞到內存中的數據也較少:
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal intAge As Integer, _
Optional ByVal intWeight As Integer)
類型確定的可選參數的訪問速度比 Variant 快,而且一旦數據類型錯誤,編譯時就顯示錯誤信息。
25利用集合的優點
可以定義和使用對象的集合是 Visual Basic 的強大功能之一。盡管集合是非常有用的,但還要正確使用才能獲得最好的效果:
使用 For Each...Next 替代 For...Next。
26. 添加集合的對象時避免使用 Before 和 After 參數。
使用鍵集而不用幾組相同對象的數組。
集合可以用 For...Next 循環進行迭代。但採用 For Each...Next 可讀性更好,而且多數情況下更快。For Each...Next 是由集合的生成器實現迭代的,所以實際的操作速度將隨集合對象的不同而改變。由於 For Each...Next 的最簡單的實現機理就是 For...Next 的線性迭代,因此 For Each...Next 不會比 For...Next 慢。但是,有些情況下採用了比線性迭代更復雜的實現機理,所以 For Each...Next 要快得多。
如果沒有使用 Before 和 After 參數,則往集合中添加對象是非常快的。否則,Visual Basic 必須在集合中檢測到其它對象後,才能添加新對象。
如果對象的類型都一樣,集合或數組都可以用來管理這些對象(如果對象的類型不一樣,則只能用集合)。從速度的觀點看,選擇何種方式取決於對象的訪問方式。如果能夠為每一對象分配唯一的鍵,則集合是訪問對象的最快方式。使用鍵從集合中檢索對象比從數組中順序遍歷對象快。當然,如果沒有鍵而要遍歷對象時,則選擇數組比較好。就順序遍歷方式而言,數組比集合快。
如果對象的個數少,則數組使用的內存小,並且搜索的速度快。當對象的個數在 100 左右時,集合比數組的效率高;當然,具體的數目還有賴於微處理器的速度和可用的內存。
26. 不要用Do While Not record.EOF 語句。
例如下面的代碼比較慢:
Do While Not record.EOF
'代碼
record.MoveNext
Loop
下面的要快好多
Record.MoveLast
intCount=Record.RecordCount
Record.MoveFirst
For i=1 To intCount
'代碼
Records.MoveNext
Next i
第二部分 編譯優化
我所見過的很多VB程序員從來沒有使用過編譯選項,也沒有試圖搞清楚各個選項之間的差別。下面讓我們來看一下各個選項的具體含義。
1. P-代碼(偽代碼)和本機代碼
你可以選擇將軟體編譯為P-代碼或是本機代碼。預設選項是本機代碼。那什麼是P-代碼和本機代碼呢?
P-代碼:當在VB中執行代碼時,VB首先是將代碼編譯為P-代碼,然後再解釋執行編譯好的P-代碼。在編譯環境下,使用這種代碼要比本機代碼快。選擇P-代碼後,編譯時VB將偽代碼放入一個EXE文件中。
本機代碼:本機代碼是VB6以後才推出的選項。當編譯為EXE文件後,本機代碼的執行速度比P-代碼快。選擇本機代碼後,編譯時VB使用機器指令生成EXE文件。
在使用本機代碼進行編譯時,我發現有時候會引入一些莫名其妙的錯誤。在編譯環境中我的代碼完全正確地被執行了,但是用本機代碼選項生成的EXE文件卻不能正確執行。通常這種情況是在卸載窗口或彈出列印窗口時發生的。我通過在代碼中加入DoEvent語句解決了這個問題。當然出現這種情況的幾率非常少,也許有些VB程序員從來沒有遇到過,但是它的確存在。
在本機代碼中還有幾個選項:
a) 代碼速度優化:該選項可以編譯出速度較快的執行文件,但執行文件比較大。推薦使用
b) 代碼大小優化:該選項可以編譯出比較小的執行文件,但是以犧牲速度為代價的,不推薦使用。
c) 無優化:該選項只是將P-代碼轉化為本機代碼,沒有做任何優化。在調試代碼時可以使用。
d) 針對Pentium Pro優化:雖然該項不是本機代碼中的預設選項,但是我通常會使用該選項。該選項編譯出的可執行程序在Pentium Pro和Pentium 2以上的機器上可以運行得更快,而在比較老的機器上要稍稍慢一些。考慮到現在用Pentium 2都是落伍,所以推薦大家使用該選項。
e) 產生符號化調試信息:該項在編譯過程中生成一些調試信息,使用戶可以利用Visual C++一類的工具來調試編譯好的代碼。使用該選項會生成一個.pdf文件,該文件記錄了可執行文件中的標志信息。當程序擁有API函數或DLL調用時,該選項還是比較有幫助的。
2. 高級優化
高級優化中的設置可以幫助你提高軟體的速度,但是有時候也會引入一些錯誤,因此我建議大家盡量小心地使用它們。如果在代碼中有比較大的循環體或者復雜的數學運算時,選中高級優化中的某些項會大幅度提升代碼的性能。如果你使用了高級優化功能,我建議你嚴格測試編譯好的文件。
a) 假定無別名:可以提高循環體中代碼的執行效率,但是在如果通過變數的引用改變變數值的情況下,例如調用一個方法,變數的引用作為方法的參數,在方法中改變了變數的值的話,就會引發錯誤。有可能只是返回的結果錯誤,也有可能是導致程序中斷運行的嚴重錯誤。
b) 取消數組綁定檢查、取消整數溢出檢查和取消浮點錯誤檢查:在程序運行時,如果通過這些檢查發現了錯誤,錯誤處理代碼會處理這些錯誤。但是如果取消了這些檢查,發生了錯誤程序就無法處理。只有當你確定你的代碼中不會出現上面的這些錯誤時,你才可以使用這些選項。它們將使軟體的性能得到很大的提升。
c) 允許不舍入的浮點操作:選擇該選項可以是編譯出來的程序更快地處理浮點操作。它唯一的缺點就是在比較兩個浮點數時可能會導致不正確的結果。
d) 取消Pentium FDIV安全檢查:該選項是針對一些老的Pentium晶元設置的,現在看來已經過時了。
『陸』 怎麼寫好VB
本文描述了如何通過一些技術手段來提高VB代碼的執行效率。這些手段可以分為兩個大的部分:編碼
技術和編譯優化技術。在編碼技術中介紹了如何通過使用高效的數據類型、減少外部引用等編程手段來提高代碼執行速度,減少代碼消耗的系統資源。在編譯優化技
術中介紹了如何正確地利用VB提供的編譯選項對在編譯時最後生成的可執行文件進行優化。
前言
什麼是一個高效的軟體?一個高效的軟體不僅應該比實現同樣功能的軟體運行得更快,還應該消耗更少的系統資源。這篇文章匯集了作者在使用VB進行軟體開
發時積累下來的一些經驗,通過一些簡單的例子來向你展示如何寫出高效的VB代碼。其中包含了一些可能對VB程序員非常有幫助的技術。在開始之前,先讓我陳
清幾個概念。
讓代碼一次成型:在我接觸到的程序員中,有很多人喜歡先根據功能需求把代碼寫出來,然後在此基礎上優化代碼。最後發現為了達到優化的目的,他們不得不把代碼再重新寫一遍。所以我建議你在編寫代碼之前就需要考慮優化問題。
把握好優化的結果和需要花費的工作之間的關系:通常當完成了一段代碼,你需要檢查和修改它。在檢查代碼的過程中,也許你會發現某些循環中的代碼效率還
可以得到進一步的改進。在這種情況下,很多追求完美的程序員也許會立馬修改代碼。我的建議是,如果修改這段代碼會使程序的運行時間縮短一秒,你可以修改
它。如果只能帶來10毫秒的性能改進,則不做任何改動。這是因為重寫一段代碼必定會引入新的錯誤,而調試新的代碼必定會花掉你一定的時間。程序員應該在軟
件性能和開發軟體需要的工作量之間找一個平衡點,而且10毫秒對於用戶來說也是一個不能體會到的差異。
在需要使用面向對象方法的時候盡量使用它;VB提供的機制不完全支持面向對象的設計和編碼,但是VB提供了簡單的類。大多數人認為使用對象將導致代碼
的效率降低。對於這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發,軟體佔用的資源也是需要考慮的因素之一。使用類可以幫助你在
整體上提升軟體的性能,這一點我會在後面的例子中詳細說明。
當你編寫VB代碼的時候,希望你能把上面幾點作為指導你編碼的原則。我把文章分為兩個部分:如何提高代碼的運行速度和編譯優化。
如何提高代碼的運行速度
下面的這些方法可以幫助你提高代碼的運行速度:
1. 使用整數(Integer)和長整數(Long)
提高代碼運行速度最簡單的方法莫過於使用正確的數據類型了。也許你不相信,但是正確地選擇數據類型可以大幅度提升代碼的性能。在大多數情況下,程序員
可以將Single,Double和Currency類型的變數替換為Integer或Long類型的變數,因為VB處理Integer和Long的能力
遠遠高於處理其它幾種數據類型。
在大多數情況下,程序員選擇使用Single或Double的原因是因為它們能夠保存小數。但是小數也可以保存在Integer類型的變數中。例如程
序中約定有三位小數,那麼只需要將保存在Integer變數中的數值除以1000就可以得到結果。根據我的經驗,使用Integer和Long替代
Single,Double和Currency後,代碼的運行速度可以提高將近10倍。
2. 避免使用變體
對於一個VB程序員來說,這是再明顯不過的事情了。變體類型的變數需要16個位元組的空間來保存數據,而一個整數(Integer)只需要2個位元組。通
常使用變體類型的目的是為了減少設計的工作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟體經過了嚴格設計和按照規范編碼的話,完全可以避免
使用變體類型。
在這里順帶提一句,對於Object對象也存在同樣的問題。請看下面的代碼:
Dim FSO
Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object
Set FSO = New Scripting.FileSystemObject
上面的代碼由於在申明的時候沒有指定數據類型,在賦值時將浪費內存和CPU時間。正確的代碼應該象下面這樣:
Dim FSO as New FileSystemObject
3. 盡量避免使用屬性
在平時的代碼中,最常見的比較低效的代碼就是在可以使用變數的情況下,反復使用屬性(Property),尤其是在循環中。要知道存取變數的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會使用到的:
Dim intCon as Integer
For intCon = 0 to Ubound(SomVar())
Text1.Text = Text1.Text & vbcrlf &
SomeVar(intCon)
Next intCon
下面這段代碼的執行速度是上面代碼的20倍。
Dim intCon as Integer
Dim sOutput as String
For intCon = 0 to Ubound(SomeVar())
sOutput = sOutput & vbCrlf &
SomeVar(intCon)
Next
Text1.Text = sOutput
4. 盡量使用數組,避免使用集合
除非你必須使用集合(Collection),否則你應該盡量使用數組。據測試,數組的存取速度可以達到集合的100倍。這個數字聽起來有點駭人聽聞,但是如果你考慮到集合是一個對象,你就會明白為什麼差異會這么大。
5. 展開小的循環體
在編碼的時候,有可能遇到這種情況:一個循環體只會循環2到3次,而且循環體由幾行代碼組成。在這種情況下,你可以把循環展開。原因是循環會佔用額外的CPU時間。但是如果循環比較復雜,你就沒有必要這樣做了。
6. 避免使用很短的函數
和使用小的循環體相同,調用只有幾行代碼的函數也是不經濟的--調用函數所花費的時間或許比執行函數中的代碼需要更長的時間。在這種情況下,你可以把函數中的代碼拷貝到原來調用函數的地方。
7. 減少對子對象的引用
在VB中,通過使用.來實現對象的引用。例如:
Form1.Text1.Text
在上面的例子中,程序引用了兩個對象:Form1和Text1。利用這種方法引用效率很低。但遺憾的是,沒有辦法可以避免它。程序員唯一可以做就是使用With或者將用另一個對象保存子對象(Text1)。
注釋: 使用With
With frmMain.Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
或者
注釋: 使用另一個對象保存子對象
Dim txtTextBox as TextBox
Set txtTextBox = frmMain.Text1
TxtTextBox.Text = "Learn VB"
TxtTextBox.Alignment = 0
TxtTextBox.Tag = "Its my life"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite
注意,上面提到的方法只適用於需要對一個對象的子對象進行操作的時候,下面這段代碼是不正確的:
With Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸的是,我們常常可以在實際的代碼中發現類似於上面的代碼。這樣做只會使代碼的執行速度更慢。原因是With塊編譯後會形成一個分枝,會增加了額外的處理工作。
8. 檢查字元串是否為空
大多數程序員在檢查字元串是否為空時會使用下面的方法:
If Text1.Text = "" then
注釋: 執行操作
End if
很不幸,進行字元串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:
If Len(Text1.Text) = 0 then
注釋: 執行操作
End if
9. 去除Next關鍵字後的變數名
在Next關鍵字後加上變數名會導致代碼的效率下降。我也不知道為什麼會這樣,只是一個經驗而已。不過我想很少有程序員會這樣畫蛇添足,畢竟大多數程序員都是惜字如金的人。
注釋: 錯誤的代碼
For iCount = 1 to 10
注釋: 執行操作
Next iCount
注釋: 正確的代碼
For iCount = 1 to 10
注釋: 執行操作
Next
10. 使用數組,而不是多個變數
當你有多個保存類似數據的變數時,可以考慮將他們用一個數組代替。在VB中,數組是最高效的數據結構之一。
11. 使用動態數組,而不是靜態數組
使用動態數組對代碼的執行速度不會產生太大的影響,但是在某些情況下可以節約大量的資源。
12. 銷毀對象
無論編寫的是什麼軟體,程序員都需要考慮在用戶決定終止軟體運行後釋放軟體佔用的內存空間。但遺憾的是很多程序員對這一點好像並不是很在意。正確的做法是在退出程序前需要銷毀程序中使用的對象。例如:
Dim FSO as New FileSystemObject
注釋: 執行操作
注釋: 銷毀對象
Set FSO = Nothing
對於窗體,可以進行卸載:
Unload frmMain
或
Set frmMain = Nothing
13. 變長和定長字元串
從技術上來說,與變長字元串相比,定長字元串需要較少的處理時間和空間。但是定長字元串的缺點在於在很多情況下,你都需要調用Trim函數以去除字元串末的空字元,這樣反而會降低代碼效率。所以除非是字元串的長度不會變化,否則還是使用變長字元串。
14. 使用類模塊,而不是ActiveX控制項
除非ActiveX控制項涉及到用戶界面,否則盡量使用輕量的對象,例如類。這兩者之間的效率有很大差異。
15. 使用內部對象
在涉及到使用ActiveX控制項和DLL的時候,很多程序員喜歡將它們編譯好,然後再加入工程中。我建議你最好不要這樣做,因為從VB連接到一個外部
對象需要耗費大量的CPU處理能力。每當你調用方法或存取屬性的時候,都會浪費大量的系統資源。如果你有ActiveX控制項或DLL的源代碼,將它們作為
工程的私有對象。
16. 減少模塊的數量
有些人喜歡將通用的函數保存在模塊中,對於這一點我表示贊同。但是在一個模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使
用它。這樣做的原因是因為只有在模塊中的函數或變數被調用時,VB才將模塊載入到內存中;當VB應用程序退出時,才會從內存中卸載這些模塊。如果代碼中只
有一個模塊,VB就只會進行一次載入操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個模塊,VB會進行多次載入操作,代碼的效率會降低。
17. 使用對象數組
當設計用戶界面時,對於同樣類型的控制項,程序員應該盡量使用對象數組。你可以做一個實驗:在窗口上添加100個PictureBox,每個
PictureBox都有不同的名稱,運行程序。然後創建一個新的工程,同樣在窗口上添加100個PictureBox,不過這一次使用對象數組,運行程
序,你可以注意到兩個程序載入時間上的差別。
18. 使用Move方法
在改變對象的位置時,有些程序員喜歡使用Width,Height,Top和Left屬性。例如:
Image1.Width = 100
Image1.Height = 100
Image1.Top = 0
Image1.Left = 0
實際上這樣做效率很低,因為程序修改了四個屬性,而且每次修改之後,窗口都會被重繪。正確的做法是使用Move方法:
Image1.Move 0,0,100,100
19. 減少圖片的使用
圖片將佔用大量內存,而且處理圖片也需要佔用很多CPU資源。在軟體中,如果可能的話,可以考慮用背景色來替代圖片--當然這只是從技術人員的角度出發看這個問題。
20. 使用ActiveX DLL,而不是ActiveX控制項
如果你設計的ActiveX對象不涉及到用戶界面,使用ActiveX DLL。
編譯優化
我所見過的很多VB程序員從來沒有使用過編譯選項,也沒有試圖搞清楚各個選項之間的差別。下面讓我們來看一下各個選項的具體含義。
1. P-代碼(偽代碼)和本機代碼
你可以選擇將軟體編譯為P-代碼或是本機代碼。預設選項是本機代碼。那什麼是P-代碼和本機代碼呢?
P-代碼:當在VB中執行代碼時,VB首先是將代碼編譯為P-代碼,然後再解釋執行編譯好的P-代碼。在編譯環境下,使用這種代碼要比本機代碼快。選擇P-代碼後,編譯時VB將偽代碼放入一個EXE文件中。
本機代碼:本機代碼是VB6以後才推出的選項。當編譯為EXE文件後,本機代碼的執行速度比P-代碼快。選擇本機代碼後,編譯時VB使用機器指令生成EXE文件。
在使用本機代碼進行編譯時,我發現有時候會引入一些莫名其妙的錯誤。在編譯環境中我的代碼完全正確地被執行了,但是用本機代碼選項生成的EXE文件卻
不能正確執行。通常這種情況是在卸載窗口或彈出列印窗口時發生的。我通過在代碼中加入DoEvent語句解決了這個問題。當然出現這種情況的幾率非常少,
也許有些VB程序員從來沒有遇到過,但是它的確存在。
在本機代碼中還有幾個選項:
a) 代碼速度優化:該選項可以編譯出速度較快的執行文件,但執行文件比較大。推薦使用
b) 代碼大小優化:該選項可以編譯出比較小的執行文件,但是以犧牲速度為代價的,不推薦使用。
c) 無優化:該選項只是將P-代碼轉化為本機代碼,沒有做任何優化。在調試代碼時可以使用。
d) 針對Pentium
Pro優化:雖然該項不是本機代碼中的預設選項,但是我通常會使用該選項。該選項編譯出的可執行程序在Pentium Pro和Pentium
2以上的機器上可以運行得更快,而在比較老的機器上要稍稍慢一些。考慮到現在用Pentium
2都是落伍,所以推薦大家使用該選項。
e) 產生符號化調試信息:該項在編譯過程中生成一些調試信息,使用戶可以利用Visual
C++一類的工具來調試編譯好的代碼。使用該選項會生成一個.pdf文件,該文件記錄了可執行文件中的標志信息。當程序擁有API函數或DLL調用時,該選項還是比較有幫助的。
2. 高級優化
高級優化中的設置可以幫助你提高軟體的速度,但是有時候也會引入一些錯誤,因此我建議大家盡量小心地使用它們。如果在代碼中有比較大的循環體或者復雜
的數學運算時,選中高級優化中的某些項會大幅度提升代碼的性能。如果你使用了高級優化功能,我建議你嚴格測試編譯好的文件。
程序的執行效率和模塊化從來就是一對矛盾,模塊化(包括現在的對象化)意味著你對代碼的重復利用程度更高,但是同時也意味這你的程序的執行效率更低,忽略
語言本身的優缺點,使用「內嵌式」代碼的執行速度要高於使用過程和函數。這一點是沒有疑問的。但是與此同時則帶來了程序本身的體積的擴大和代碼維護的困
難。因為當你的程序中有數個地方採用了相同的代碼時,使用模塊和類無疑是最有效率的做法。
但是拋開這些不談,很多人畢竟不是對於程序涉及非常熟練,因為他們的首要目的是解決問題而要優化一個程序則是一個可大可小的事。
要小,我們可以從數據類型的轉換,一個演算法的實現來體現這種效率,而要大,則可能從頭寫這個程序會比修改來得更有效率。(相信這是很多高手的切身體會)
那麼要如何才能避免這樣的麻煩呢?
首先,在VB這中,我們可以在很多地方避免效率的低下,因為VB本身就不是一種以速度見長的語言,我們就必須在寫程序的時候更多得考慮到這個缺點。比如,
當你的界面中出現的TEXTBOX多過10個的時候你會怎麼處理呢?哈哈,你想到了控制項數組,非常好,使用控制項數組要比使用十個單獨的控制項的資源佔用小。
並且在處理類似的事件的時候(比如要格式化輸入內容等等)你可以使用控制項的INDEX和一個循環來處理,這個做法要比使用十個TEXT控制項更有效率,並且
速度也更快,代碼的修改也更容易。但是當你的一個窗體中出現了數十個甚至上百個TEXT控制項的時候,你就需要想一下了,你是否因該換一個控制項呢?或許你使
用一個GRID控制項會讓你的工作更順利一些呢?
其二,不要以為VB什麼也不能做,很多東西並不需要高深的API,使用VB自己帶的功能也能夠完成同樣事,並且代碼也更簡潔,只是你沒有去好好想而已。我
這里可以舉非常多的例子來說明這個問題:比如無邊框窗體的移動,比如多個VB程序之間(甚至和不是VB的程序之間)的數據交換,比如一些圖像處理的問題等
等,其實使用VB自帶的方法和控制項完全可以解決,根本不需要一個API,並且速度並不慢,而程序的可讀性也不錯。不相信嗎?我就寫過不少。
其三,VB畢竟是一種被大眾所承認的語言,它的優點有很多,或許只是你不知道而已,很多人說它的速度慢,但是我要說的是;「你的程序真的寫好了嗎?」,雖
然使用控制項是VB的一個非常方便的地方,但我們也不能光依靠控制項。特別是在控制項板塊中經常看到諸如:「某某東西有沒有什麼控制項控制項可以實現啊」之類的問
題,老實說,我並不認為一個使用控制項非常熟練的人就一定是一個VB的高手,在很多時候我並不依賴控制項,我寧可自己寫一個比較「土」的演算法來實現我的方法也
不想用一個控制項,因為使用一個控制項就意味著你的依賴性。我在網路上看到類似什麼「MP3播放器」之類的程序不下幾十個,但是從來也沒有看到過一個使用代碼
來解碼的程序,這不能不說是一個遺憾。控制項是個好東西,但是只會使用控制項的話,我想你永遠也成不了一個合格的程序員。
關於這個問題,可能有很多人會和我爭論,我並不害怕爭論。我是一個從C過來的人,我經歷過很多現在的程序員沒有經歷過的痛苦常式:不知道你是否體驗過在DOS下寫一個圖形化並且支持滑鼠的程序是多麼煩惱的事。如果你干過,那你就會同意我的觀點。
哪怕你對「面對對象」的概念再熟,請不要忘記,在這個「對象」的內部,還是需要「面對過程」的。所以學一些「古老」的東西對你沒有壞處。
其四:語言真的是一樣的,到了一定的程度你就會發出這樣感慨。前一陣子,我看了點關於C51單片機的編程,我真的發現這是多麼簡單的一種東西。它只要求你
有一點記憶力,能夠記住那些拗口的命令而已,其他的東西我都可以寫出來。程序就是這么一個簡單的東西,只要你了解了它的原理,任何語言都一樣。區別只在於
它們實現的方法有些不同而已。
過一段時間我想公布一個我寫的控制項的代碼,是關於圖像處理的。其中既有可以在網上找到的演算法,也有我自己想出來的方法。我只是想通過這個東西來說明一件事:VB不是一個「玩具語言」它能作的比你能想到的要多的多,只是你以為不能做到,或是沒有想到而已。
關於代碼的優化有很多很多可說的,翻一下程序設計的書,你可以找到很多例子,各種語言也有各種語言的特點。我這里先舉一個非常小的例子希望可以說明一下問題:一個交換兩個變數內容的過程,如何實現(假設是整數型的)?
當然這是一個非常非常簡單的問題,幾乎每一個寫程序的人都能寫出代碼實現。但是效率呢?通過這個例子我只是想說明一個問題而已。
我們以VB來舉例吧:
一般的:
SUB EXCHANGE(A AS LONG,B AS LONG)
DIM C AS LONG
C=A
A=B
B=C
END SUB
簡單吧?使用了一個中間變數C就解決問題了。那麼再看看另一種不常見的方法:
SUB EXCHANGE(A AS LONG, B AS LONG)
B = B XOR A
A = B XOR A
B = B XOR A
END SUB
是否有點難以理解?老實說,同樣是交換了內容,但是效率不同,或許交換一次你感覺不出來,但是有興趣的話你可以寫一個循環,比如交換個一百萬次,再使用TIMEGETTIME這個API來看一下各自所花費的時間,保證不一樣,哪個快,你自己試驗吧。
VB處理計算並不慢,不信的話你可以寫一個四則運算的循環來檢測一下,VB慢的地方在於GDI,不信的話你試試載入很多窗體和可見控制項。這個是沒有辦法
的,是VB本身的局限,但是很多時候我們需要的並不是一個「更快的」控制項,而是「更少的」控制項,就象我前面說的,能使用控制項數組的時候就用控制項數組,控制項
數組太多的時候就看看有沒有可替代的單個控制項,當使用相同功能的時候盡量使用資源少的控制項,比如在不需要輸入的時候我們可以用LABEL來代替TEXT,
在不需要編輯和保存圖片的時候我們可以使用IMAGE來代替PICTUREBOX,等等。甚至很多時候根本不需要使用控制項或對象,通過代碼就可以實現相同
的演算法比載入一個控制項要快很多。
補充第四點:不要迷信API,VB並非離開API就什麼也幹不了。很多問題沒有API也能幹得很好,我不是學計算機專業的,很多「專業」的知識我並不具
備,就象上次那個DIB的東西就讓我費了好長的時間,後來還是多虧了這里的朋友幫忙才解決的,但是並非就說離開了API就什麼也做不了了。至少不會DIB
的時候我也使用VB自己的方法實現相同的功能(當然是比較慢),但是畢竟也是解決問題的。要知道解決一個問題本身才是最重要的,實現的方法其實並不是最重
要的。說到這里或許又有很多人來反駁我,當然,我也知道很多時候必須使用更快的方法來解決問題,但是我的方法是:先找到一個「可以」解決問題的方法,當問
題可以解決之後,我再會去研究如何改進演算法使它更有效。呵呵,這個世界還是以成敗論英雄的,不是嗎?
記得我以前用TOUBOR
C的時候,老是搞不懂那個INT怎麼弄,結果呢,對面計算機系的朋友用INT解決了一個「簡單」問題,我缺按照我的方法老老實實的用C語言自己帶的功能實
現了。這還要感謝TC編譯器的強大,我的程序居然不比他的慢多少。呵呵,但是這個結果很讓我興奮,因為我覺得我這樣一個「半路和尚」也能做計算機專業的
事。呵呵。給大家一個鼓勵。
參考http://blog.sina.com.cn/s/blog_4cd34de50100ews9.html
『柒』 VB6.0寫的程序可以反編譯得到代碼嗎
真正反編譯是不可能的,不管是P代碼還是本機代碼,不加殼也反編譯不了,至於什麼.net反編譯,更是痴人說夢!網上雖有一些反編譯軟體,但是頂多把你用了哪些控制項找出來,至於代碼就無能為力了
『捌』 VB編譯為P-代碼是什麼意思
p代碼:全稱pseudo-code偽代碼意思VB編譯兩種編譯式種Native-Code(本代碼)另種p-codeP-code
或偽代碼介於
Basic
程序高級指令計算機處理器執行低級本機代碼間種間步驟
論選擇哪都需要運行庫自WINXP版本都自帶VB6運行庫
雖VBGOOD等論壇已經牛使用VB6寫機器+匯編代碼脫離運行庫程序變臃腫原理運行庫集自身或者全部使用API函數
『玖』 VB6自帶編譯器的「本機代碼」和「P代碼」各是什麼求答案
該選項卡設置工程編譯時的條件。選項卡選項「編譯為 P-代碼」
用 p 代碼來編譯工程。存儲在 .vbp 文件中的設置值將被覆蓋掉。
「編譯為本機代碼」
用帶有選定最優化的原碼來編譯工程。存儲在 .vbp 文件中的設置值將被覆蓋掉。
「快速代碼優化」- 通過指示編譯器在速度和大小之間首選速度,使 .exe 和 .dll 文件的速度最快。編譯器可以減少許多功能上跟機器碼序列相同的構造。在某些情況下,這種不同提供了用大小來換取速度的權衡交換。
「小代碼優化」- 通過指示編譯器在速度和大小之間首選大小,來使 .exe 和 .dll 文件最小。編譯器可以減少許多功能上跟機器碼序列相同的構造。如果不選中這個選項,代碼可能就會大一些,但是速度會更快一些。
「非優化」- 無優化地編譯。
「流行的 Pentium Pro™」- 優化所創建的代碼,優化方向是使之更有利於 Pentium Pro™ 處理器來處理。如果在程序中使用了這個選項,則意味著僅僅是為 Pentium Pro™ 處理器所創建的代碼。用此選項產生的代碼仍然可以在更早期的處理器上運行,但是工作起來性能不是那麼好。
「創建符號化調試信息」- 在可執行文件或者 DLL 文件中產生符號調試信息。用此選項創建的可執行文件可以用 Visual C++ 或者具有 CodeView 風格調試信息的調試器來調試。設置這個選項將為可執行文件產生一個帶有符號信息的 .pdb 文件。
「高級優化」
顯示「高級優化」對話框。
給程序設置一個基地址,從而覆蓋 .dll 文件的預設位置(在 0 X 10,000,000 處)。操作系統首先試圖在指定的或者預設的位置載入一個程序。如果沒有足夠空間,那麼系統將重新定位該程序。