如何在VBA中使数组计算更有效

时间:2013-10-08 01:21:54

标签: vba excel-vba excel

我最近学会了使用数组作为我的VBA宏的一部分。我知道它们是有效使用VBA的一个组成部分,因此我想了解更多关于如何有效地处理数组的信息。我搜索了一下,发现了一些文章,但是如果有一些重要的东西我不知道,请告诉我。

这是一个示例代码,一个查找第N个素数的子程序。它通过在一个素数数组上使用试验除法,动态地向数组添加新的素数来实现这一点。

Sub FindNthPrime()
    StartTime = Timer
    Dim Counter, n, i As Single
    Dim Primes() As Double  'An array of primes so far
    Dim TestVal As Double
    Dim PrimeTest As Boolean
    
    n = 100000  'Find the n'th prime number
    
    ReDim Primes(0)
    Primes(0) = 2  'Start the array at 2
    Counter = 1    'Start the Counter at 1
    TestVal = 3    'Start testing with 3
    
    Do Until Counter = n
        PrimeTest = True
        For i = 0 To UBound(Primes)
            If Primes(i) > (TestVal ^ 0.5) Then Exit For
            If TestVal Mod Primes(i) = 0 Then
                PrimeTest = False
                Exit For
            End If
        Next i
        
        If PrimeTest = True Then
            ReDim Preserve Primes(UBound(Primes) + 1)
            Primes(UBound(Primes)) = TestVal
            Counter = UBound(Primes) + 1
        End If
        
        TestVal = TestVal + 2
    Loop
    
    Debug.Print Primes(UBound(Primes))
    Debug.Print Timer - StartTime
End Sub

在一个基本的基准测试中,这个代码在不使用数组的情况下表现优于蛮力试验分割算法(测试所有奇数到我们测试数的平方根),但不是很多。随着质量变大,在这种情况下是100,000的素数,我们的机器上的计算时间超过了5秒。

TL; DR:有关提高上述代码效率的任何提示吗?

1 个答案:

答案 0 :(得分:1)

Dim Counter, n, i As Single
默认类型为variant,因此计数器和nvariants
Redim Preserve是一个昂贵的选项,所以从数字大小开始,并在Redim Preserve中增加一个大数字。
尽可能使用Long而不是singledouble
但大部分时间可能会由Mod^

执行