2015-09-04 3 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" 

Какая скорость лучше и удобнее?

Это?

MyString = MyArray(1) 
For i = 2 To 5 
    MyString = MyString & " " & MyArray(i) 
Next 

Или это?

MyString = Join(MyArray, " ") 
+2

Я предполагаю присоединиться будет быстрее, так как он реализован в родном коде, пока вы растете строку на каждой итерации с для цикла и вызвать дважды оператор конкатенации., Возможно получение системного времени до и после (с более крупный массив) может дать некоторую подсказку, по которой лучше. – Tensibai

+1

Я бы посоветовал использовать решение, более читаемое вам лично. Для меня это будет Join, потому что это намного проще концептуально, и позволяет избежать ошибок «один за другим» и других возможных тонких ошибок. Почему вы считаете, что выполнение этого конкретного кода более важно для вашего приложения по сравнению с тем, что делает ваше приложение? – mellamokb

+0

При построении строки никогда не конкатенируйте длинную строку с двумя короткими строками (заставляя длинную строку копировать дважды). Так что вместо 'MyString = MyString &" "& MyArray (i)' use '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 

Join является явным победителем

2.050781 
0 

причина в том, что каждый раз, когда вы сцепить с & памяти должен быть перераспределены для размещения нового массива (это все строки в любом случае). С Join вы просто копируете один массив (исходный массив) в другой массив (строка), а VBA уже знает размер.

2

Если вы хотите эффективно объединить множество строк, вы можете определить класс stringbuilder.

Выполнение кода ниже для создания строки чисел до миллиона занимает всего лишь часть секунды (0,3 с). Построение массива и использование Join займет недолгое время (0,25 с), вызов функции 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 
Смежные вопросы