我目前正在声明multiple arrays
,超过25个,包含数字和空格,类型为Variant
。我知道Variant可以减慢很多宏。 问题:Variant
是正确的选择,还是其他类型更好?示例代码如下......
Dim RM1() As Variant
RM1() = Array("64", "65", " ", "66", "67", " ", "68", "69", " ", _
"70", "71", " ", "72", "73", " ", "74", "75", " ", "76", _
" ", "77", "", "78", " ", "79", " ")
Dim RM2() As Variant
RM2() = Array("20", " ", " ", "21")
等。等
答案 0 :(得分:2)
变量data type必须为Variant
才能与Array
函数一起使用。
数组函数
语法:
Array (
arglist
)
返回包含数组的
Variant
。所需的
arglist
参数是以逗号分隔的值列表,这些值分配给 Variant <中包含的数组元素/强>注意: 未声明为数组的 Variant 仍然可以包含数组。 Variant 变量可以包含任何类型的数组,除了固定长度字符串和用户定义类型。虽然包含数组的 Variant 是在概念上不同于其元素类型为 Variant 的数组,数组元素以相同的方式访问。
(Source)功能
我测试了你的理论,操作速度受到数组的数据类型的影响。
使用您的示例,除Variant
之外只有一种数据类型可以使用(String
),因为您的数组是保持数字以及“空格”。
数字(500万次循环) † **
Integer() 1.08 sec 20% faster than Variant
Long() 1.09 sec
Single() 1.29 sec
Variant() 1.34 sec
Double() 1.37 sec
数字(2500万次循环) † **
Variant() 6.16 sec Variant is 9% faster than String
String() 6.76 sec
以文字存储的数字(500万次循环) † **
Integer() 5.45 sec Variant is 32% faster than Integer
Variant() 7.99 sec
因此,它是真的:非Variant数据类型的数组处理比
快20%。但是在这种情况下,这意味着 0.6 seconds
保存在 20亿与数组的交互中。使用GMalc的example data:
需要注意的重要事项:对于OP的示例数据:将数字存储为字符串(如您的示例数据)是您真正的问题,最多需要六倍而不是使用数字数据类型。
使用四个数字字符串的运行时间 † :
Type #1 #2 #3 #4 #5
----------- ------ ------ ------ ------ ------
Variant() 6.18 6.15 6.15 6.14 6.12 seconds
Variant() 6.2 6.2 6.21 6.18 6.19
Variant() 6.22 6.18 6.16 6.19 6.19
Variant() 6.14 6.11 6.12 6.11 6.14
String() 7.09 6.79 7.12 6.73 6.77
String() 6.87 6.72 6.77 6.7 6.68
String() 6.7 6.69 6.7 6.69 6.7
String() 6.7 6.68 6.68 6.71 6.69
使用4位数字的运行时间 † :
Integer() 1.09 1.07 1.08 1.08 1.09 seconds
Integer() 1.07 1.09 1.08 1.07 1.08
Integer() 1.08 1.07 1.08 1.08 1.09
Integer() 1.09 1.08 1.07 1.08 1.09
Long() 1.08 1.08 1.09 1.08 1.08
Long() 1.09 1.08 1.08 1.09 1.08
Long() 1.09 1.08 1.2 1.09 1.08
Long() 1.09 1.09 1.09 1.09 1.09
Single() 1.29 1.3 1.29 1.29 1.29
Single() 1.29 1.29 1.29 1.28 1.28
Single() 1.29 1.28 1.29 1.29 1.28
Single() 1.29 1.27 1.3 1.29 1.29
Double() 1.28 1.27 1.29 1.3 1.34
Double() 1.34 1.34 1.52 1.76 1.43
Double() 1.3 1.33 1.4 1.3 1.35
Double() 1.38 1.41 1.38 1.4 1.33
Variant() 1.33 1.34 1.32 1.34 1.32
Variant() 1.32 1.34 1.32 1.33 1.32
Variant() 1.34 1.34 1.34 1.42 1.31
Variant() 1.35 1.39 1.33 1.38 1.38
运行时 † for Variant / Integer,4位数字:
Variant() 6.61 6.59 6.59 6.59 6.6 seconds
Variant() 8.36 8.88 8.29 8.17 8.18
Variant() 9.13 9.41 8.59 8.25 8.27
Variant() 8.25 8.17 8.16 8.38 8.29
Integer() 5.45 5.45 5.43 5.44 5.45
Integer() 5.45 5.44 5.44 5.45 5.45
Integer() 5.44 5.44 5.45 5.45 5.45
Integer() 5.44 5.45 5.46 5.45 5.45
† 测试方法:
每个#test有500万个循环,每个“互动”一个数组4次,乘以5x4进程
= 4亿次与每种数据类型的数组“交互”
每个#test有2500万个循环,每个“互动”一个数组4次,乘以5x4进程
= 20亿与数组的交互
下面是我为测试打了一针的代码:
Option Explicit
Const loops = 25000000
Public arr1(1 To loops) As Integer, arr2(1 To loops) As Integer, el
Sub runTests()
Dim t As Long
Debug.Print TypeName(arr1) & " (" & loops & " loops): ";
For t = 1 To 5
Debug.Print "#" & t & ": " & Format(testArray, "0.00") & "sec, ";
DoEvents
Next t
Debug.Print "Done."
End Sub
Function testArray() As Double
'are arrays faster to use when data type is non-variant?
'I consider this procedure to be "touching" the arrays a "total of (4 * [Loops]) times"
Dim x As Long, startTime As Single: startTime = Timer
For x = 1 To loops 'populate arr1 with 4-digit numeric strings
arr1(x) = IIf(TypeName(arr2) = "String", CStr(Int((Rnd() * 11000) + 1001)), Int((Rnd() * 11000) + 1001))
Next x
For x = LBound(arr1) To UBound(arr1) 'copy arr1 to arr2, one element at a time
arr2(x) = arr1(x)
Next x
For Each el In arr2 'iterate & clear arr2
If el = IIf(TypeName(arr2) = "String", "99999", 99999) Then '(won't be found)
Debug.Print "Found!"
Exit For
End If
el = Null
Next el
testArray = (Timer - startTime)
End Function