/ / Różnica między użyciem metody append klasy StringBulder a konkatenacją operatora "+" [duplicate] - c #

Różnica między użyciem metody append klasy StringBulder a konkatenacją operatora "+" [duplikat] - c #

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 № 1

Po 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.