資料|資料類型|效能 在我們寫VBA程式的時候,我們經常要面對資料類型定義的選擇,有的情況下,業務本身對於資料類型有要求和限制,那麼我們並不難以選擇,有些時候卻沒有限制,我們可以任意選用四種整數類型(Byte,Integer,Long,Currency)中的一種,例如:
For i=1 to 100
在這行代碼中,我們該把變數i定義為什麼類型的變數呢?顯然四種整數類型都可以正常運行,但是他們的效率是否相同呢?我們到底該如何選擇?有的人說,當時是選最小的資料類型Byte,有的人說在32位系統上,32位的Long類型才是效率最高的。
那麼究竟誰說的是正確的,讓我們來進行一下這四種整數類型的效能對比測試,我們使用如下代碼:
Const LoopTimes = 100000000
Public Sub test()
Dim bytTmp As Byte
Dim intTmp As Integer
Dim lngTmp As Long
Dim curTmp As Currency
Dim loopCount As Long
Dim timeBegin As Single
Dim timeEnd As Single
Dim timeAddition As Single
timeBegin = Timer
For loopCount = 0 To LoopTimes
Next loopCount
timeEnd = Timer
timeAddition = timeEnd - timeBegin
timeBegin = Timer
For loopCount = 0 To LoopTimes
bytTmp = 255
Next loopCount
timeEnd = Timer
Debug.Print "Byte :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
intTmp = 255
Next loopCount
timeEnd = Timer
Debug.Print "Integer :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
lngTmp = 255
Next loopCount
timeEnd = Timer
Debug.Print "Long :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
curTmp = 255
Next loopCount
timeEnd = Timer
Debug.Print "Currency :"; timeEnd - timeBegin - timeAddition; "秒"
Debug.Print "*********************"
End Sub
在這裡,我們對每個整數類型進行了1億次的賦值操作,同時減去了迴圈控制所消耗的空轉時間,剩下的就是純粹的賦值操作所需的時間。最後,讓我們來看看啟動並執行結果:
Byte : 7.234375 秒
Integer : 2.421875 秒
Long : 3.4375 秒
Currency : 4.84375 秒
*********************
Byte : 7.234375 秒
Integer : 2.421875 秒
Long : 3.453125 秒
Currency : 4.875 秒
*********************
Byte : 7.21875 秒
Integer : 2.421875 秒
Long : 3.421875 秒
Currency : 4.875 秒
*********************
看到這裡,我想大家都應該很清楚了,雖然Byte佔用記憶體最少,但是他的效能卻是最差的,如果對於單個變數,我們沒有必要使用Byte,當然Byte在大塊資料區段進行指標操作的時候,還是有他的非凡之處。剩下三種整數資料類型裡面,Integer效能最佳,Currency效能最差。我們儘可能選擇能夠滿足我們業務需要的最小資料類型。
上面是賦值操作的效能對比,下面我們來進行位操作的效能對比測試,我們使用如下代碼:
Const LoopTimes = 10000000
Public Sub test()
Dim bytTmp As Byte
Dim intTmp As Integer
Dim lngTmp As Long
Dim curTmp As Currency
Dim strTmp As String
Dim loopCount As Long
Dim timeBegin As Single
Dim timeEnd As Single
Dim timeAddition As Single
timeBegin = Timer
For loopCount = 0 To LoopTimes
strTmp = 255
Next loopCount
timeEnd = Timer
timeAddition = timeEnd - timeBegin
timeBegin = Timer
For loopCount = 0 To LoopTimes
strTmp = bytTmp Or 255
Next loopCount
timeEnd = Timer
Debug.Print "Byte :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
strTmp = intTmp Or 255
Next loopCount
timeEnd = Timer
Debug.Print "Integer :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
strTmp = lngTmp Or 255
Next loopCount
timeEnd = Timer
Debug.Print "Long :"; timeEnd - timeBegin - timeAddition; "秒"
timeBegin = Timer
For loopCount = 0 To LoopTimes
strTmp = curTmp Or 255
Next loopCount
timeEnd = Timer
Debug.Print "Currency :"; timeEnd - timeBegin - timeAddition; "秒"
Debug.Print "*********************"
End Sub
這裡,我們所比較的是逐位或操作,同樣我們扣除了迴圈控制時間,賦值時間,下面讓我們來看看結果:
Byte : .625 秒
Integer : .296875 秒
Long : .296875 秒
Currency : .890625 秒
*********************
Byte : .609375 秒
Integer : .34375 秒
Long : .328125 秒
Currency : .90625 秒
*********************
Byte : .484375 秒
Integer : .265625 秒
Long : .203125 秒
Currency : .8125 秒
*********************
Byte : .53125 秒
Integer : .328125 秒
Long : .28125 秒
Currency : .875 秒
*********************
我們可以看到,在位操作項目上,Byte趕上了Currency成了第三名,而Integer和Long則咬得很緊,但是最終還是Long勝出了,看來在32位系統上,32位元據類型確實有位操作上的優勢,不要以為1位元組位操作就會比4位元組位操作快,事實上正好相反,4位元組>2位元組>1位元組。
綜合以上表現,我們的結論是,Byte和Currency的表現是最差的,但是這兩個資料類型有他們的特殊用途,Byte適用於記憶體塊的大量操作,Currency適用資料類型不確定的時候,剩下的Integer和Long,Integer在賦值操作上更快,Long在位操作上更快。
現在你知道該如何選擇整數資料類型了嗎?