Łańcuchy (String) w Visual Basic .NET są niemodyfikowalne (immutable). Każda operacja, na przykład konkatenacja, prowadzi do stworzenia nowego łańcucha, a nie zmiany istniejącego. Przy dużej liczbie sklejania/zmian łańcuchów prowadzi to do zauważalnych spadków wydajności i zwiększonego zużycia pamięci.
Do pracy z dużymi ilościami tekstu zaleca się korzystanie z odpowiednich klas do wydajnego manipulowania łańcuchami. W Visual Basic .NET jest to System.Text.StringBuilder, który pozwala na modyfikację bufora łańcucha bez ciągłego przydzielania nowej pamięci.
Przykład z StringBuilder:
Imports System.Text Dim builder As New StringBuilder() For i As Integer = 1 To 100000 builder.Append("Łańcuch " & i & vbCrLf) Next Dim result As String = builder.ToString()
Pytanie: „Czy przy pracy z dużymi plikami tekstowymi można po prostu składać łańcuchy przez operator & i nie martwić się o wydajność?”
Odpowiedź: Nie. Jeśli w pętli składasz łańcuchy przez &, to dla każdej iteracji tworzony jest nowy obiekt łańcucha, a wszystkie jego symbole są dodatkowo kopiowane. To jest nieefektywne przy dużych objętościach danych. Lepiej korzystać z StringBuilder.
Przykład:
' Ten kod jest bardzo wolny przy dużych N: Dim s As String = "" For i = 1 To 1000000 s = s & "a" Next ' A ten - znacznie szybszy: Dim sb As New StringBuilder() For i = 1 To 1000000 sb.Append("a") Next Dim s = sb.ToString()
Historia:
W aplikacji internetowej projekt zbierał newslettery e-mail poprzez zwykłą konkatenację łańcuchów w pętli po
&. Przy objętościach przekraczających 10 000 wiadomości system zaczynał „zawieszać się” i padał z powodu przepełnienia pamięci. Po przejściu na StringBuilder te problemy zniknęły.
Historia:
W procedurze logowania błędów log był zbierany przez wielokrotne dodawanie łańcuchów poprzez zwykłe dodawanie. To znacznie zwiększało czas zapisu logu i spowalniało pracę całego parsera. Po audycie i refaktoryzacji z użyciem StringBuilder szybkość pracy wzrosła pięciokrotnie.
Historia:
Przy generowaniu raportów w popularnych plikach XLS analityk wybrał prostą metodę - łączenie wszystkich wartości w jeden łańcuch przez &. Efekt: podczas generowania raportu na 10 000 wierszy aplikacja przestawała odpowiadać. Zastąpienie StringBuilderem rozwiązało problem wydajności i wycieków pamięci.