高级编程:快速交换字符串
我们要做的是交换两个字符串。
常规的方法:
Sub ChgStr1(s1 As String, s2 As String)
Dim s$
s = s1: s1 = s2: s2 = s
End Sub
指针的方法:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Sub ChgStr2(s1 As String, s2 As String)
Dim tmp&
CopyMemory tmp, ByVal VarPtr(s1), 4
CopyMemory ByVal VarPtr(s1), ByVal VarPtr(s2), 4
CopyMemory ByVal VarPtr(s2), tmp, 4
End Sub
哪一个更快,不说你也知道了。在VB下,编译后,后者比前者要快一倍。VBA下,没有这么悬殊,笔者测试的结果,应该快25%以上。但由于后者不受交换字符串长短的影响,所以在交换长字符串时,优势会更明显。
下面是测试代码,有兴趣试试吧:
注意:有时下面的测试并不能得到上面的结果,但如果你加大两个字符串的长度到一定程度,上面的结论是成立的。
Sub aTest()
Dim i&, tm&, t1
Dim s1$, s2$
tm = 999999 '测试次数
s1 = "abc"
s2 = "cde"
t1 = Timer
i = 1 To tm
ChgStr1 s1, s2
Next i
Debug.Print Timer - t1
t1 = Timer
For i = 1 To tm
ChgStr2 s1, s2
Next i
Debug.Print Timer - t1
End Sub