[VB] 到底時間拖在哪裡
簡單的來說, 就是物件類別產生後, 時間到底慢在哪?
時間表如下, 由物件類別完成 Value 設定, 但是到 Form_GotFocus 卻越拖越長...
nPoint Form_Load (s) Form_GotFocus (s)
-----------------------------------------------
1,000 0 0.109375
10,000 0.269513 5
20,000 0.5507813 32.23828
100,000 25.48252 不明 (等了四分鐘只好強迫中斷)
-----------------------------------------------
測試環境:
CPU: Pentium II 300, SVGA: S680/4MB, DRAM: 64 MB, OS: Win98c SE, VB5 SP3
測試程式碼如下:
-- cPoint.cls -- 自訂物件類別模組
Public x As Double
Public y As Double
Public z As Double
----------------
-- Form1.frm -- 測試用, Form1 畫面上未佈置任何物件
Private st
Private Sub Form_GotFocus()
Debug.Print Timer - st
End Sub
Private Sub Form_Load()
nPoint = 20000
st = Timer
ReDim cP(1 To nPoint) As New cPoint
For i = 1 To nPoint
With cP(i)
.x = Rnd
.y = Rnd
End With
Next i
Debug.Print Timer - st
st = Timer
End Sub
------------------
簡單的來說, 就是物件類別產生後, 時間到底慢在哪?
時間表如下, 由物件類別完成 Value 設定, 但是到 Form_GotFocus 卻越拖越長...
nPoint Form_Load (s) Form_GotFocus (s)
-----------------------------------------------
1,000 0 0.109375
10,000 0.269513 5
20,000 0.5507813 32.23828
100,000 25.48252 不明 (等了四分鐘只好強迫中斷)
-----------------------------------------------
測試環境:
CPU: Pentium II 300, SVGA: S680/4MB, DRAM: 64 MB, OS: Win98c SE, VB5 SP3
測試程式碼如下:
-- cPoint.cls -- 自訂物件類別模組
Public x As Double
Public y As Double
Public z As Double
----------------
-- Form1.frm -- 測試用, Form1 畫面上未佈置任何物件
Private st
Private Sub Form_GotFocus()
Debug.Print Timer - st
End Sub
Private Sub Form_Load()
nPoint = 20000
st = Timer
ReDim cP(1 To nPoint) As New cPoint
For i = 1 To nPoint
With cP(i)
.x = Rnd
.y = Rnd
End With
Next i
Debug.Print Timer - st
st = Timer
End Sub
------------------
文章標籤
全站熱搜

我試了你的程式,以下是我的結果。我的電腦是 P-II 400, 192MB RAM nPoint FormLoad GotFocus ------------------------------ 20,000 0.91 s 0.94 s 100,000 12.49 s 23.41 s ------------------------------ 我同時發現這支程式不管是在 VB 在執行或是編譯成執行檔速率都不會差太多。而且在程式執行時 (nPoint=10萬),這支程式吃記憶體約 18MB。 所以結論是..... 你的 RAM 裝太少了,裝那麼少的 RAM 想跑這麼大量的資料,一定會很慢的,所以趕快叫你的老闆買 RAM 吧!
我是在想, Form_Load 時可以把變數設進去就表示記憶體已經宣告完成, 但是從 Form_Load 到 Form_GotFocus 這段時間程式到底在做什麼? 裁減物件記憶體嗎? 還是?? 這段時間只有一段程式碼: st=Timer 但是程式跟當了一般傻在那... 但如果把它改成形態 (Type) , 即使宣告放大到 10 倍 (nPoint=1,000,000) 在 Form_Load 到 Form_GotFocus 這段時間一樣趨近於 0 (小於 1/18.2 s) 我想要縮短從 Form_Load 到 Form_GotFocus 這段時間, 只能用形態, 但是 VB 5 的自訂類別物件不支援傳回使用者自訂形態, 很麻煩耶... 不知道要怎麼才能處理...
我想這真的是vb的問題,我們也有發現當同時產生過多的自定class物件 時,速度會變得很慢(如同璉璉的描述),所以了,想辦法減少class 物件的產生可能對速度會有所幫助。 有沒有可能用一個class,內含您要的x,y,z,並組成Type。要有n個tPoint,就產生n個該種Type,但全都包含在該單一class,之後新增該class一些存取tPoint的方法。而我們仍可以傳回該物件,只是物件內含 的tPoint方是您所要的資料
VB5 的Class 不能傳 UDT,這個說法只對一半,正確的說法為:VB5 的 Public Class 不能傳UDT,但是 Private Class 可以透過 Friend Interface 來傳 UDT 至於你所提供的程式碼,有一點奇怪,奇怪的地方是你的 cP array 宣告在 Form_Load 中, 當Form_Load 結束後,cp array 就被destructor,那宣告 cP 的目的何再?如果 你的 cP 是宣告在 Form 的 General Section 的地方,就不會有你所說的從 Form_Load 至Form_GotFocus 之間Delay 的現像. 假設你的 cP 是刻意宣告在 Form_Load 中,則從Form_Load 至Form_GotFocus中間 的Delay 是非常正常的現像,因為在Form_Load Procedure 結束後,VB 要負責 把 cP 所存的Object 做 destructor 的動作,那當然會等到 destructor 作完後, 才會執行 Form_GotFocus
回覆 NuNo --- 我想我了解您的意思, 因為我把程式碼簡化的不像話才有這個疑問... ****************** 另外關於 --- VB5 的Class 不能傳 UDT,這個說法只對一半,正確的說法為:VB5 的 Public Class 不能傳UDT,但是 Private Class 可以透過 Friend Interface 來傳 UDT --- 我不是很能體會您的意思, 是否能針對此部份說明呢? 我試過使用者自訂類別是不允許 UserDefType Public Get test(...) as UserDefType 即使 UserDefType 為主模組所宣告公用亦為相同, 而 VB5 所提供的文件亦記載了不能使用使用者自定形態, 所以我不是很能體會您這部分的意思 謝謝您的指教!