从字符串数组中创建一个字符串。最快的方法?
问题描述:
我有一串字符串(A到E),我想加入到一个字符串(“A B C D E”)。我应该循环访问数组还是使用Join函数?从字符串数组中创建一个字符串。最快的方法?
Dim MyArray(5) as String
Dim MyString as String
MyArray(1) = "A"
MyArray(2) = "B"
MyArray(3) = "C"
MyArray(4) = "D"
MyArray(5) = "E"
哪个更快,更明智?
This?
MyString = MyArray(1)
For i = 2 To 5
MyString = MyString & " " & MyArray(i)
Next
或者这个?
MyString = Join(MyArray, " ")
答
对于100K阵列
Sub test()
Dim aArr(1 To 100000) As String
Dim i As Long
Dim sString As String
Dim snTimer As Single
FillArray aArr
snTimer = Timer
For i = 1 To 100000
sString = sString & Space(1) & aArr(i)
Next i
Debug.Print Timer - snTimer
snTimer = Timer
sString = Join(aArr, Space(1))
Debug.Print Timer - snTimer
End Sub
加入是明显的赢家
2.050781
0
的原因是,每次你&
记忆串连时间要重新分配,以适应新的数组(无论如何都是字符串)。使用Join,您只需将一个数组(源数组)复制到另一个数组(字符串),并且VBA已知道大小。
答
如果要高效地组合多个字符串,可以定义一个stringbuilder类。
运行下面的代码构建一串数字高达一百万只需要几分之一秒(0.3秒)。建立一个数组并使用Join
需要的时间相差不多(0.25s),对Join
函数的调用只需要大约10%的时间。
如果字符串已经在一个数组中,那么使用Join
是有意义的,但是对于少量的字符串,差异不太可能是明显的。
Sub JoinStringTest()
Dim i As Long, t As Double
Dim sb As New StringBuilder
Dim sbRet As String
Dim joinRet As String
t = Timer
For i = 1 To 1000000
sb.Append CStr(i)
Next
sbRet = sb.Text
Debug.Print "SB", Timer - t
t = Timer
Dim a(1000000) As String
For i = 1 To 1000000
a(i) = CStr(i)
Next i
joinRet = Join(a, "")
Debug.Print "Join", Timer - t
Debug.Print sbRet = joinRet
End Sub
我想加盟会更快,因为它在本地Code的实现,当你在与for循环每次迭代成长串并调用连接操作两次,也许让系统时间之前和之后(含一个更大的阵列)可以给出一些线索,哪一个更好。 – Tensibai
我建议使用更易于个人阅读的解决方案。对我来说,这将是Join,因为它在概念上更简单,并且避免了错误和其他可能的细微错误。为什么您认为这段代码的性能对于您的应用程序而言比您应用程序的其他应用程序更重要? – mellamokb
构建字符串时,不要将长字符串与两个短字符串连接(强制将长字符串复制两次)。因此,而不是'MyString = MyString&“”&MyArray(i)'使用'MyString = MyString&(“”&MyArray(i))' – brettdj