Jaka jest różnica w korzystaniu z metody Append klasy StringBuilder i konkatenacji za pomocą operatora "+"?
W jaki sposób metoda Append działa wydajniej lub szybciej niż operator "+" przy łączeniu dwóch łańcuchów?
Odpowiedzi:
5 dla odpowiedzi № 1Po pierwsze, String
i StringBuilder
są różnymi klasami.
String
klasa reprezentuje niezmienne typy ale StringBuilder
klasa reprezentuje typy zmienne.
Kiedy używasz +
złączyć twoje struny, używa String.Concat
metoda. I za każdym razem zwraca nowy obiekt typu string.
StringBuilder.Append
metoda dołącza a Kopiuj określonego ciągu. Nie zwraca nowego ciągu, zmienia oryginalny.
Dla sprawnej części powinieneś przeczytać artykuł Jeffa o nazwie The Sad Tragedy of Micro-Optimization Theater
To. Właśnie. Nie ma znaczenia!
Nie znamy żadnej z tych operacji będziewykonywane w pętli, więc możemy wykluczyć brutalnie słabe charakterystyki wydajnościowe łączenia naiwnych ciągów. Wszystko to w lewo to mikrooptymalizacja, a zaraz po tym zaczynasz się martwić małe drobne optymalizacje, zszedłeś już na złą drogę.
Och, nie wierzysz mi? Niestety, nie wierzyłem w to sam, co jest dlaczego mnie w to wciągnąłem. Oto moje wyniki - na 100 000 powtórzeń w dwurdzeniowym rdzeniu 3,5 GHz Core 2 Duo.
1: Simple Concatenation 606 ms
2: String.Format 665 ms
3: string.Concat 587 ms
4: String.Replace 979 ms
5: StringBuilder 588 ms
0 dla odpowiedzi nr 2
Łańcuch jest niezmienny, więc kiedy dodajesz, faktycznie tworzysz nowy obiekt w tle.
Kiedy używasz StringBuilder
, zapewnia wydajną metodę łączenia łańcuchów.
Szczerze mówiąc, nie zauważysz dużej poprawy, jeśli użyjesz go raz lub dwa razy. Ale wydajność pojawia się, gdy używasz StringBuilder
w pętlach.
0 dla odpowiedzi № 3
Po połączeniu dwóch łańcuchów tworzy się nowy łańcuch z wynikiem. StringBuilder ma możliwość zmiany rozmiaru podczas dodawania, co może być szybsze.
Tak jak w przypadku wszystkich rzeczy, to zależy. Jeśli po prostu łączysz dwa małe łańcuchy w ten sposób:
string s = "a" + "b";
W najlepszym przypadku nie będzie różnicy w wydajności, ale prawdopodobnie będzie to szybsze niż użycie StringBuilder i łatwiejsze do odczytania.
StringBuilder jest bardziej odpowiedni dla przypadków, w których łączysz dowolną liczbę ciągów, których nie znasz podczas kompilacji.