VB“超頻”秘籍之隱藏的Variant變量
火眼識破隱藏的Variant變量
如果沒有用As語句聲明變量,默認類型就是Variants,比如:
或者,當前模塊下沒有聲明Option Explicit語句時,任何變量都是Variants類型。
許多開發者,特別是那些先前是C程序員的人,都會深信下面的語句將聲明2個Interger類型變量:
而實際上,x被聲明為了variant類型。由于variant類型變量要比Integer類型慢很多,所以要特別注意這種情況。正確的一行聲明方法是:
GoSub在編譯程序中速度變慢
編譯為本地代碼的VB應用程序中,如果使用 GoSubs 命令,就會比通常的 Subs 或者 Function 調用慢5-6倍;相反,如果是p-code模式,就會相當快。 減少DoEvents語句的數量
不要在代碼中放置不必要的DoEvents語句,尤其是在時間要求高的循環中。遵循這個原則,至少能在循環中的每N次反復時才執行DoEvents語句,從而增強效率。比如使用下面的語句:
如果只是使用DoEvents來屏蔽鼠標以及鍵盤操作,那么就可以在事件隊列中存在待處理項目時調用它。通過API函數GetInputState來檢查這個條件的發生:
為常量定義合適的類型
VB在內部使用最簡單、最可能的數據類型保存符號數值,這意味著最通常的數字類型-比如0或者1-都按照Integer類型存儲。如果在浮點表達式中使用這些常量,可以通過常量的合適類型來加速程序運行,就象下面的代碼:
這個語句強迫編譯器按照Double格式存儲常量,這樣就省卻了運行時的隱含轉換工作。還有另外的一種處理方法就是:在常量聲明時就進行相應類型的定義,代碼如下:
And、Or和Xor:讓我們來優化表達式
要檢測一個整數值的最高有效位是否有數值,通常要使用如下的代碼(有二種情況:第一組If判斷表明對Integer類型,第二組對Long類型):
但由于所有的VB變量都是有符號的,因此,最高有效位也是符號位,不管處理什么類型的數值,通過下面的代碼就可以實現檢測目的:
另外,要檢測2個或者更多個數值的符號,只需要通過一個Bit位與符號位的簡單表達式就可以完成。下面是應用這個技術的幾段具體代碼:
1、判斷X和Y是否為同符號數值:
2、判斷X、Y和Z是否都為正數
3、判斷X、Y和Z是否都為負數
4、判斷X、Y和Z是否都為0
5、判斷X、Y和Z是否都不為0
要使用這些來簡單化一個復雜的表達式,必須要完全理解boolean型的操作原理。比如,你可能會認為下面的2行代碼在功能上是一致的:
然而我們可以輕易地證明他們是不同的,比如X=3(二進制=0011),Y=4(二進制=0100)。不過沒有關系,遇到這種情況時,我們可以對上面的代碼進行局部優化,就能實現目的。代碼如下:
如果沒有用As語句聲明變量,默認類型就是Variants,比如:
| Dim name ’ this is a variant |
或者,當前模塊下沒有聲明Option Explicit語句時,任何變量都是Variants類型。
許多開發者,特別是那些先前是C程序員的人,都會深信下面的語句將聲明2個Interger類型變量:
| Dim x, y As Integer |
而實際上,x被聲明為了variant類型。由于variant類型變量要比Integer類型慢很多,所以要特別注意這種情況。正確的一行聲明方法是:
| Dim x As Integer, y As Integer |
GoSub在編譯程序中速度變慢
編譯為本地代碼的VB應用程序中,如果使用 GoSubs 命令,就會比通常的 Subs 或者 Function 調用慢5-6倍;相反,如果是p-code模式,就會相當快。 減少DoEvents語句的數量
不要在代碼中放置不必要的DoEvents語句,尤其是在時間要求高的循環中。遵循這個原則,至少能在循環中的每N次反復時才執行DoEvents語句,從而增強效率。比如使用下面的語句:
| If (loopNdx Mod 10) = 0 Then DoEvents |
如果只是使用DoEvents來屏蔽鼠標以及鍵盤操作,那么就可以在事件隊列中存在待處理項目時調用它。通過API函數GetInputState來檢查這個條件的發生:
| Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long ’ ... If GetInputState() Then DoEvents |
為常量定義合適的類型
VB在內部使用最簡單、最可能的數據類型保存符號數值,這意味著最通常的數字類型-比如0或者1-都按照Integer類型存儲。如果在浮點表達式中使用這些常量,可以通過常量的合適類型來加速程序運行,就象下面的代碼:
| value# = value# + 1#. |
這個語句強迫編譯器按照Double格式存儲常量,這樣就省卻了運行時的隱含轉換工作。還有另外的一種處理方法就是:在常量聲明時就進行相應類型的定義,代碼如下:
| Const ONE As Double = 1 |
And、Or和Xor:讓我們來優化表達式
要檢測一個整數值的最高有效位是否有數值,通常要使用如下的代碼(有二種情況:第一組If判斷表明對Integer類型,第二組對Long類型):
| If intValue And &H8000 Then ’ most significant bit is set End If If lngValue And &H80000000 Then ’ most significant bit is set End If |
但由于所有的VB變量都是有符號的,因此,最高有效位也是符號位,不管處理什么類型的數值,通過下面的代碼就可以實現檢測目的:
| If anyValue < 0 Then ’ most significant bit is set End If |
另外,要檢測2個或者更多個數值的符號,只需要通過一個Bit位與符號位的簡單表達式就可以完成。下面是應用這個技術的幾段具體代碼:
1、判斷X和Y是否為同符號數值:
| If (x < 0 And y < 0) Or (x >= 0 And y >=0) Then ... ’ the optimized approach If (x Xor y) >= 0 Then |
2、判斷X、Y和Z是否都為正數
| If x >= 0 And y >= 0 And z >= 0 Then ... ’ the optimized approach If (x Or y Or z) >= 0 Then ... |
3、判斷X、Y和Z是否都為負數
| If x < 0 And y < 0 And z < 0 Then ... ’ the optimized approach If (x And y And z) < 0 Then ... |
4、判斷X、Y和Z是否都為0
| If x = 0 And y = 0 And z = 0 Then ... ’ the optimized approach If (x Or y Or z) = 0 Then ... |
5、判斷X、Y和Z是否都不為0
| If x = 0 And y = 0 And z = 0 Then ... ’ the optimized approach If (x Or y Or z) = 0 Then ... |
要使用這些來簡單化一個復雜的表達式,必須要完全理解boolean型的操作原理。比如,你可能會認為下面的2行代碼在功能上是一致的:
| If x <> 0 And y <> 0 Then If (x And y) Then ... |
然而我們可以輕易地證明他們是不同的,比如X=3(二進制=0011),Y=4(二進制=0100)。不過沒有關系,遇到這種情況時,我們可以對上面的代碼進行局部優化,就能實現目的。代碼如下:
| If (x <> 0) And y Then ... |