testuser, впечатляет — в 2 раза быстрее варианта на
Mod (вариант на
Int выбыл по причине некорректности, но там примерно, как на
Mod время)
Тест |
---|
Код |
---|
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Private Type tpLong
l As Long
End Type
'--------------------------------------------------------------------------------------------------
Private Type tpRGB
r As Byte
g As Byte
b As Byte
End Type
'--------------------------------------------------------------------------------------------------
Private Sub LongToRGB_Type(l&, bR As Byte, bG As Byte, bB As Byte)
Dim tL As tpLong, tRGB As tpRGB
tL.l = l
LSet tRGB = tL
bR = tRGB.r
bG = tRGB.g
bB = tRGB.b
End Sub
'==================================================================================================
Private Sub LongToRGB_Int(l&, bR As Byte, bG As Byte, bB As Byte)
Dim n&
bB = Int(l / 65536)
n = (l - (bB * 65536))
bG = Int(n / 256)
bR = (n - (bG * 256))
End Sub
'==================================================================================================
Private Sub LongToRGB_Mod(l&, bR As Byte, bG As Byte, bB As Byte)
Dim n&
bR = (l Mod 256)
bG = ((l / 256) Mod 256)
bB = ((l / 65536) Mod 256)
End Sub
'==================================================================================================
Private Sub Test_LongToRGB()
Dim bR As Byte, bG As Byte, bB As Byte
Dim t!, l&, n&
l = rgb(0, 0, 0) ' 1
l = rgb(255, 0, 0) ' 2
l = rgb(0, 255, 0) ' 3 Error when LongToRGB_Int
l = rgb(0, 0, 255) ' 4
l = rgb(100, 100, 100) ' 5
l = rgb(255, 255, 255) ' 6
t = Timer ' 1 | 2 | 3 | 4 | 5 | 6
For n = 1 To 10000000
' LongToRGB_Type l, bR, bG, bB ' 0.9 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8
' LongToRGB_Mod l, bR, bG, bB ' 1.0 | 1.6 | 1.5 | 1.0 | 1.6 | 1.6
' LongToRGB_Int l, bR, bG, bB ' 1.2 | 1.7 |
Next n
Debug.Print Format$(Timer - t, "0.0"), bR, bG, bB
End Sub |
|
Большое спасибо! Расскажите, пожалуйста, что там происходит (как раскладывается) и как типы повлияли на скорость?
P.S.: если отойти от теста и избежать преобразований, которые нужны были в тесте для сравнения методов между собой (то есть, напрямую передавать в тип и читать из него), то будет ещё быстрее (возможно, незаметно).