什么类型的变量最适合数组?

时间:2018-06-03 06:21:57

标签: excel-vba vba excel

我目前正在声明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")

等。等

1 个答案:

答案 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的示例数据:将数字存储为字符串(如您的示例数据)是您真正的问题,最多需要六倍而不是使用数字数据类型。

详细测试结果&amp;代码:

使用四个数字字符串的运行时间

    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