2015-09-04 15 views
5

Ho una matrice di stringhe (dalla A alla E) che voglio unire in una stringa ("A B C D E"). Dovrei passare attraverso l'array o usare la funzione Join?Creazione di una stringa da una matrice di stringhe. Metodo più veloce?

Dim MyArray(5) as String 
Dim MyString as String 

MyArray(1) = "A" 
MyArray(2) = "B" 
MyArray(3) = "C" 
MyArray(4) = "D" 
MyArray(5) = "E" 

Quale è più veloce e più consigliabile?

Questo?

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

O questo?

MyString = Join(MyArray, " ") 
+2

presumo unirsi sarà più veloce come è implementato in codice nativo, mentre si sta crescendo la stringa ad ogni iterazione con il ciclo e chiamare due volte l'operatore di concatenazione., Forse ottenendo il tempo di sistema prima e dopo (con un array più ampio) potrebbe dare qualche indizio su quale sia meglio. – Tensibai

+1

Consiglierei di utilizzare la soluzione che è più leggibile per te personalmente. Per me, questo sarebbe il Join perché è molto più semplice dal punto di vista concettuale ed evita errori off-by-one e altri possibili bug sottili. Perché credi che le prestazioni di questo particolare pezzo di codice siano più importanti per la tua applicazione rispetto a qualsiasi altra cosa faccia la tua applicazione? – mellamokb

+0

Quando si crea una stringa, non concatenare mai una stringa lunga con due stringhe corte (forzando la copia della stringa lunga due volte). Quindi piuttosto che 'MyString = MyString &" "& MyArray (i)' usa 'MyString = MyString & (" "& MyArray (i))' – brettdj

risposta

2

Per una matrice 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 è il chiaro vincitore

2.050781 
0 

il motivo è che ogni volta che si concatenano con & memoria deve essere riassegnati per accogliere il nuovo array (che sono tutte le stringhe sono comunque). Con Join, stai solo copiando un array (l'array sorgente) in un altro array (la stringa) e VBA conosce già le dimensioni.

2

Se si desidera combinare più stringhe in modo efficiente, è possibile definire una classe stringbuilder.

L'esecuzione del codice seguente per creare una stringa di numeri fino a un milione richiede solo una frazione di secondo (0,3 s). La creazione di un array e l'utilizzo di Join richiede la stessa ora (0,25 secondi), la chiamata alla funzione Join richiede solo il 10% circa di quel tempo.

Se le stringhe sono già in una matrice, è consigliabile utilizzare Join ma con un numero limitato di stringhe la differenza è improbabile che sia comunque evidente.

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 
Problemi correlati