2015-09-04 78 views
5

我有一串字符串(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, " ") 
+2

我想加盟會更快,因爲它在本地Code的實現,當你在與for循環每次迭代成長串並調用連接操作兩次,也許讓系統時間之前和之後(含一個更大的陣列)可以給出一些線索,哪一個更好。 – Tensibai

+1

我建議使用更易於個人閱讀的解決方案。對我來說,這將是Join,因爲它在概念上更簡單,並且避免了錯誤和其他可能的細微錯誤。爲什麼您認爲這段代碼的性能對於您的應用程序而言比您應用程序的其他應用程序更重要? – mellamokb

+0

構建字符串時,不要將長字符串與兩個短字符串連接(強制將長字符串複製兩次)。因此,而不是'MyString = MyString&「」&MyArray(i)'使用'MyString = MyString&(「」&MyArray(i))' – brettdj

回答

2

對於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已知道大小。

2

如果要高效地組合多個字符串,可以定義一個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 
相關問題