内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

vbnet代碼效率 vbnet線程

VB 請問高手,如何讓 VB 運行的速度快?

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、南票網(wǎng)站維護、網(wǎng)站推廣。

1. 使用整數(shù)(Integer)和長整數(shù)(Long)

提高代碼運行速度最簡單的方法莫過于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將Single,Double和Currency類型的變量替換為Integer或Long類型的變量,因為VB處理Integer和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程序員來說,這是再明顯不過的事情了。變體類型的變量需要16個字節(jié)的空間來保存數(shù)據(jù),而一個整數(shù)(Integer)只需要2個字節(jié)。通常使用變體類型的目的是為了減少設(shè)計的工作量和代碼量,也有的程序員圖個省事而使用它。但是如果一個軟件經(jīng)過了嚴格設(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)

Next intCon

下面這段代碼的執(zhí)行速度是上面代碼的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))

如上述,幾種方法都實現(xiàn)了同樣的任務(wù);同時,最好的算法也是最優(yōu)的。

4. 盡量使用數(shù)組,避免使用集合

除非你必須使用集合(Collection),否則你應(yīng)該盡量使用數(shù)組。據(jù)測試,數(shù)組的存取速度可以達到集合的100倍。這個數(shù)字聽起來有點駭人聽聞,但是如果你考慮到集合是一個對象,你就會明白為什么差異會這么大。

5. 展開小的循環(huán)體

在編碼的時候,有可能遇到這種情況:一個循環(huán)體只會循環(huán)2到3次,而且循環(huán)體由幾行代碼組成。在這種情況下,你可以把循環(huán)展開。原因是循環(huán)會占用額外的CPU時間。但是如果循環(huán)比較復(fù)雜,你就沒有必要這樣做了。

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。利用這種方法引用效率很低。但遺憾的是,沒有辦法可以避免它。程序員唯一可以做就是使用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

很不幸的是,我們常??梢栽趯嶋H的代碼中發(fā)現(xiàn)類似于上面的代碼。這樣做只會使代碼的執(zhí)行速度更慢。原因是With塊編譯后會形成一個分枝,會增加了額外的處理工作。

8. 檢查字符串是否為空

大多數(shù)程序員在檢查字符串是否為空時會使用下面的方法:

If Text1.Text = "" then

' 執(zhí)行操作

End if

很不幸,進行字符串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:

If Len(Text1.Text) = 0 then

' 執(zhí)行操作

End if

9. 去除Next關(guān)鍵字后的變量名

在Next關(guān)鍵字后加上變量名會導(dǎo)致代碼的效率下降。我也不知道為什么會這樣,只是一個經(jīng)驗而已。不過我想很少有程序員會這樣畫蛇添足,畢竟大多數(shù)程序員都是惜字如金的人。

' 錯誤的代碼

For iCount = 1 to 10

' 執(zhí)行操作

Next iCount

' 正確的代碼

For iCount = 1 to 10

' 執(zhí)行操作

Next

10. 使用數(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 FileSystemObject

' 執(zhí)行操作

' 銷毀對象

Set FSO = Nothing

對于窗體,可以進行卸載:

Unload frmMain

Set frmMain = Nothing

13. 變長和定長字符串

從技術(shù)上來說,與變長字符串相比,定長字符串需要較少的處理時間和空間。但是定長字符串的缺點在于在很多情況下,你都需要調(diào)用Trim函數(shù)以去除字符串末的空字符,這樣反而會降低代碼效率。所以除非是字符串的長度不會變化,否則還是使用變長字符串。

14. 使用類模塊,而不是ActiveX控件

除非ActiveX控件涉及到用戶界面,否則盡量使用輕量的對象,例如類。這兩者之間的效率有很大差異。

15. 使用內(nèi)部對象

在涉及到使用ActiveX控件和DLL的時候,很多程序員喜歡將它們編譯好,然后再加入工程中。我建議你最好不要這樣做,因為從VB連接到一個外部對象需要耗費大量的CPU處理能力。每當你調(diào)用方法或存取屬性的時候,都會浪費大量的系統(tǒng)資源。如果你有ActiveX控件或DLL的源代碼,將它們作為工程的私有對象。

16. 減少模塊的數(shù)量

有些人喜歡將通用的函數(shù)保存在模塊中,對于這一點我表示贊同。但是在一個模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使用它。這樣做的原因是因為只有在模塊中的函數(shù)或變量被調(diào)用時,VB才將模塊加載到內(nèi)存中;當VB應(yīng)用程序退出時,才會從內(nèi)存中卸載這些模塊。如果代碼中只有一個模塊,VB就只會進行一次加載操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個模塊,VB會進行多次加載操作,代碼的效率會降低。

17. 使用對象數(shù)組

當設(shè)計用戶界面時,對于同樣類型的控件,程序員應(yīng)該盡量使用對象數(shù)組。你可以做一個實驗:在窗口上添加100個PictureBox,每個PictureBox都有不同的名稱,運行程序。然后創(chuàng)建一個新的工程,同樣在窗口上添加100個PictureBox,不過這一次使用對象數(shù)組,運行程序,你可以注意到兩個程序加載時間上的差別。

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. 減少圖片的使用

圖片將占用大量內(nèi)存,而且處理圖片也需要占用很多CPU資源。在軟件中,如果可能的話,可以考慮用背景色來替代圖片--當然這只是從技術(shù)人員的角度出發(fā)看這個問題。

20. 使用ActiveX DLL,而不是ActiveX控件

如果你設(shè)計的ActiveX對象不涉及到用戶界面,使用ActiveX DLL。

21. 使用類可以提高軟件的整體性能

VB提供的機制不完全支持面向?qū)ο蟮脑O(shè)計和編碼,但是VB提供了簡單的類。大多數(shù)人認為使用對象將導(dǎo)致代碼的效率降低。對于這一點我個人有些不同的意見;考察代碼的效率不能純粹從運行速度的角度出發(fā),軟件占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能。

22. 盡可能使用常數(shù)

使用常數(shù)可以加快應(yīng)用程序的運行,增強代碼的可讀性,而且易于維護。如果代碼中的字符串或數(shù)字是不變的,則可把它們聲明為常數(shù)。常數(shù)在編譯時只處理一次,將適當?shù)闹祵戇M代碼;而變量在每次運行應(yīng)用程序時都要讀取當前值。

盡量使用對象瀏覽器中列舉的內(nèi)部常數(shù),而不要自己去創(chuàng)建。不要擔心應(yīng)用程序中引用的模塊包含多余的常數(shù);多余的常數(shù)在形成 .exe 文件時被刪除。

23. 用 ByVal 傳遞參數(shù),而不用 ByRef

編寫含參數(shù)的 Sub 或 Function 過程時,按值 (ByVal) 傳遞參數(shù)比按地址 (ByRef) 快。盡管 Visual Basic 中參數(shù)傳遞的缺省方式是按地址的 (ByRef) ,但實際上需要改變參數(shù)值的過程極少。如果過程中不需改變參數(shù)的值,就可以按值 (ByVal) 來傳遞,舉例說明如下:

Private Sub DoSomething(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, _

Optional ByVal vntWeight As Variant)

使用類型確定的可選參數(shù),每次調(diào)用時占用的堆棧空間較少,而且傳遞到內(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 的強大功能之一。盡管集合是非常有用的,但還要正確使用才能獲得最好的效果:

使用 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 慢。但是,有些情況下采用了比線性迭代更復(fù)雜的實現(xiàn)機理,所以 For Each...Next 要快得多。

如果沒有使用 Before 和 After 參數(shù),則往集合中添加對象是非??斓?。否則,Visual Basic 必須在集合中檢測到其它對象后,才能添加新對象。

如果對象的類型都一樣,集合或數(shù)組都可以用來管理這些對象(如果對象的類型不一樣,則只能用集合)。從速度的觀點看,選擇何種方式取決于對象的訪問方式。如果能夠為每一對象分配唯一的鍵,則集合是訪問對象的最快方式。使用鍵從集合中檢索對象比從數(shù)組中順序遍歷對象快。當然,如果沒有鍵而要遍歷對象時,則選擇數(shù)組比較好。就順序遍歷方式而言,數(shù)組比集合快。

如果對象的個數(shù)少,則數(shù)組使用的內(nèi)存小,并且搜索的速度快。當對象的個數(shù)在 100 左右時,集合比數(shù)組的效率高;當然,具體的數(shù)目還有賴于微處理器的速度和可用的內(nèi)存。

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

第二部分 編譯優(yōu)化

我所見過的很多VB程序員從來沒有使用過編譯選項,也沒有試圖搞清楚各個選項之間的差別。下面讓我們來看一下各個選項的具體含義。

1. P-代碼(偽代碼)和本機代碼

你可以選擇將軟件編譯為P-代碼或是本機代碼。缺省選項是本機代碼。那什么是P-代碼和本機代碼呢?

P-代碼:當在VB中執(zhí)行代碼時,VB首先是將代碼編譯為P-代碼,然后再解釋執(zhí)行編譯好的P-代碼。在編譯環(huán)境下,使用這種代碼要比本機代碼快。選擇P-代碼后,編譯時VB將偽代碼放入一個EXE文件中。

本機代碼:本機代碼是VB6以后才推出的選項。當編譯為EXE文件后,本機代碼的執(zhí)行速度比P-代碼快。選擇本機代碼后,編譯時VB使用機器指令生成EXE文件。

在使用本機代碼進行編譯時,我發(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優(yōu)化:雖然該項不是本機代碼中的缺省選項,但是我通常會使用該選項。該選項編譯出的可執(zhí)行程序在Pentium Pro和Pentium 2以上的機器上可以運行得更快,而在比較老的機器上要稍稍慢一些。考慮到現(xiàn)在用Pentium 2都是落伍,所以推薦大家使用該選項。

e) 產(chǎn)生符號化調(diào)試信息:該項在編譯過程中生成一些調(diào)試信息,使用戶可以利用Visual C++一類的工具來調(diào)試編譯好的代碼。使用該選項會生成一個.pdf文件,該文件記錄了可執(zhí)行文件中的標志信息。當程序擁有API函數(shù)或DLL調(diào)用時,該選項還是比較有幫助的。

2. 高級優(yōu)化

高級優(yōu)化中的設(shè)置可以幫助你提高軟件的速度,但是有時候也會引入一些錯誤,因此我建議大家盡量小心地使用它們。如果在代碼中有比較大的循環(huán)體或者復(fù)雜的數(shù)學運算時,選中高級優(yōu)化中的某些項會大幅度提升代碼的性能。如果你使用了高級優(yōu)化功能,我建議你嚴格測試編譯好的文件。

a) 假定無別名:可以提高循環(huán)體中代碼的執(zhí)行效率,但是在如果通過變量的引用改變變量值的情況下,例如調(diào)用一個方法,變量的引用作為方法的參數(shù),在方法中改變了變量的值的話,就會引發(fā)錯誤。有可能只是返回的結(jié)果錯誤,也有可能是導(dǎo)致程序中斷運行的嚴重錯誤。

b) 取消數(shù)組綁定檢查、取消整數(shù)溢出檢查和取消浮點錯誤檢查:在程序運行時,如果通過這些檢查發(fā)現(xiàn)了錯誤,錯誤處理代碼會處理這些錯誤。但是如果取消了這些檢查,發(fā)生了錯誤程序就無法處理。只有當你確定你的代碼中不會出現(xiàn)上面的這些錯誤時,你才可以使用這些選項。它們將使軟件的性能得到很大的提升。

c) 允許不舍入的浮點操作:選擇該選項可以是編譯出來的程序更快地處理浮點操作。它唯一的缺點就是在比較兩個浮點數(shù)時可能會導(dǎo)致不正確的結(jié)果。

d) 取消Pentium FDIV安全檢查:該選項是針對一些老的Pentium芯片設(shè)置的,現(xiàn)在看來已經(jīng)過時了。

VB編寫的程序運行慢嗎

這是相對的。如果采用相同算法要實現(xiàn)相同目的,VB的表現(xiàn)要遜于C/C++等偏向機器語言。VB的編碼是將高級語言代碼轉(zhuǎn)換為偽代碼,偽代碼的運行效率略低,而C/C++運行效率偏高。但是在.NET架構(gòu)下的(VB/VC++/VC# .NET)所有代碼都是經(jīng).NET Framework轉(zhuǎn)化的,所以速度近似。早期的VC++應(yīng)該達到最高效率。但算法一旦效率低下,任何高效運行都將顯得無力。

vb.net操作數(shù)據(jù)庫的效率問題

select * from XXX 如果數(shù)據(jù)量少還可以,如果數(shù)據(jù)量一大,需要從適配器在讀取到Dataset中,這個是相當耗時的。

其實,有一些程序可以采用 分段讀取,多次讀取。

像這樣的寫法,更新一條數(shù)據(jù),就需要在重新讀取所有的數(shù)據(jù)。。耗費太大資源和貸款。。

客戶端也會導(dǎo)致很慢甚至讀取數(shù)據(jù)假死。。

-----------------------------

最好的方式不管你用DataRead還是什么,這些都根本解決不了這些問題。

你需要做的就是 如何高效讀取/處理數(shù)據(jù)。

BS 結(jié)構(gòu),可以采用異步加載數(shù)據(jù)和處理數(shù)據(jù)

CS結(jié)構(gòu) 異步加載和分段讀取數(shù)據(jù)。而不是一下子就把所有數(shù)據(jù)加載處理。這樣的話,CPU和內(nèi)存占用率就會抬高。。。。

---------------------------------

之前公司采用的方式就是這樣的,DataSet和Fill

后來發(fā)現(xiàn)不好,于是就采用異步,服務(wù)器壓力減少,客戶端滿意度提高。。

網(wǎng)頁標題:vbnet代碼效率 vbnet線程
文章地址:http://m.rwnh.cn/article40/doopieo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、Google、微信公眾號網(wǎng)站內(nèi)鏈、做網(wǎng)站標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
景东| 塔城市| 洛隆县| 拉孜县| 丰原市| 南川市| 金阳县| 光山县| 永吉县| 靖西县| 甘孜县| 天门市| 杭锦后旗| 阳原县| 仙游县| 永善县| 什邡市| 盐山县| 长乐市| 沛县| 长治县| 叶城县| 皮山县| 米脂县| 静乐县| 甘南县| 河曲县| 冀州市| 延津县| 老河口市| 安西县| 陆川县| 宜丰县| 鹤岗市| 湖南省| 漳浦县| 彭州市| 深州市| 合山市| 武宁县| 林周县|