甚麼是一個高效的軟件。本站提示廣大學習愛好者:(甚麼是一個高效的軟件)文章只能為提供參考,不一定能成為您想要的結果。以下是甚麼是一個高效的軟件正文
甚麼是一個高效的軟件?一個高效的軟件不只應當比完成異樣功效的軟件運轉得更快,還應當消費更少的體系資本。這篇文章聚集了作者在應用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芯片設置的,如今看來曾經過時了