Twoje wyjaśnienie, dlaczego jest nieefektywne, jest dokładne, przynajmniej w językach, które znam (C, Java, C #), chociaż nie zgadzam się, że wykonywanie masowych konkatenacji ciągów jest powszechne. W kodzie C # i pracować, jest obfite wykorzystanie StringBuilder
, String.Format
itp, które są oszczędności techiniques w celu uniknięcia nadmiernej realokacji pamięci.
Aby uzyskać odpowiedź na twoje pytanie, musimy zadać kolejne pytanie: jeśli tak naprawdę nigdy nie jest to problem łączenia łańcuchów, dlaczego klasy miałyby lubić StringBuilder
i StringBuffer
istnieć ? Dlaczego korzystanie z takich klas jest uwzględnione nawet w podręcznikach i klasach dla początkujących? Dlaczego pozornie dojrzałe porady dotyczące optymalizacji byłyby tak widoczne?
Gdyby większość deweloperów łączących łańcuchy opierała swoją odpowiedź wyłącznie na doświadczeniu, większość powiedziałaby, że to nigdy nie robi różnicy i unikałaby używania takich narzędzi na rzecz „bardziej czytelnej” for (int i=0; i<1000; i++) { strA += strB; }
. Ale nigdy tego nie zmierzyli.
Prawdziwą odpowiedź na to pytanie można znaleźć w tej odpowiedzi SO , która ujawnia, że w jednym przypadku, łącząc 50 000 ciągów (które w zależności od aplikacji mogą być częstym zjawiskiem), nawet małe, spowodowało 1000-krotny wzrost wydajności .
Jeśli wydajność dosłownie w ogóle nic nie znaczy, to na pewno połączymy się. Ale ja się nie zgadzam, że przy użyciu alternatywnych (StringBuilder) jest trudna lub mniej czytelny , a zatem byłaby rozsądna praktyka programowania, który nie powinna wywoływać przedwczesne „optymalizacji” obrony.
AKTUALIZACJA:
Myślę, że sprowadza się to do znajomości platformy i stosowania najlepszych praktyk, które niestety nie są uniwersalne . Dwa przykłady z dwóch różnych „współczesnych języków”:
- W innej odpowiedzi SO , dokładnie odwrotne cechy wydajności (array.join vs + =) okazały się czasami prawdziwe w JavaScript . W niektórych przeglądarkach konkatenacja ciągów wydaje się być optymalizowana automatycznie, aw innych przypadkach tak nie jest. Tak więc zaleceniem (przynajmniej w tym pytaniu SO) jest po prostu konkatenacja i nie martwienie się o to.
- W innym przypadku kompilator Java może automatycznie zastąpić konkatenację bardziej wydajną konstrukcją, taką jak StringBuilder. Jednak, jak zauważyli inni, jest to nieokreślone, nie jest gwarantowane, a użycie StringBuilder nie szkodzi czytelności. W tym konkretnym przypadku odradzałbym stosowanie konkatenacji dla dużych kolekcji lub poleganie na nieokreślonym zachowaniu kompilatora Java. Podobnie w .NET nigdy nie jest przeprowadzana optymalizacja tego rodzaju .
Nie jest to główny grzech, aby nie znać od razu wszystkich niuansów każdej platformy, ale ignorowanie ważnych problemów związanych z platformą byłoby prawie jak przejście z Javy do C ++ i nie dbanie o zwolnienie pamięci.