什麼是一個高效的軟件。本站提示廣大學習愛好者:(什麼是一個高效的軟件)文章只能為提供參考,不一定能成為您想要的結果。以下是什麼是一個高效的軟件正文
什麼是一個高效的軟件?一個高效的軟件不只應該比完成異樣功用的軟件運轉得更快,還應該耗費更少的零碎資源。這篇文章聚集了作者在運用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. 初級優化
初級優化中的設置可以協助你進步軟件的速度,但是有時分也會引入一些錯誤,因而我建議大家盡量小心腸運用它們。假如在代碼中有比擬大的循環體或許復雜的數學運算時,選中初級優化中的某些項會大幅度提升代碼的功能。假如你運用了初級優化功用,我建議你嚴厲測試編譯好的文件。
a) 假定無別名:可以進步循環體中代碼的執行效率,但是在假如經過變量的援用改動變量值的狀況下,例如調用一個辦法,變量的援用作為辦法的參數,在辦法中改動了變量的值的話,就會引發錯誤。有能夠只是前往的後果錯誤,也有能夠是招致順序中綴運轉的嚴重錯誤。
b) 取消數組綁定反省、取消整數溢出反省和取消浮點錯誤反省:在順序運轉時,假如經過這些反省發現了錯誤,錯誤處置代碼會處置這些錯誤。但是假如取消了這些反省,發作了錯誤順序就無法處置。只要當你確定你的代碼中不會呈現下面的這些錯誤時,你才可以運用這些選項。它們將使軟件的功能失掉很大的提升。
c) 允許不捨入的浮點操作:選擇該選項可以是編譯出來的順序更快地處置浮點操作。它獨一的缺陷就是在比擬兩個浮點數時能夠會招致不正確的後果。
d) 取消Pentium FDIV平安反省:該選項是針對一些老的Pentium芯片設置的,如今看來曾經過時了