czy operator + jest mniej wydajny niż StringBuffer.Dołącz()

W moim zespole zwykle robimy konkatentację strun w następujący sposób:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

Oczywiście o wiele bardziej czytelne jest:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

Ale eksperci js twierdzą, że operator + jest mniej wydajny niż StringBuffer.append(). Czy to prawda?

Author: Dónal, 2008-09-22

13 answers

Internet Explorer jest jedyną przeglądarką, która naprawdę cierpi z tego powodu w dzisiejszym świecie. (Wersje 5, 6 i 7 były powolne. 8 nie wykazuje takiej samej degradacji.) Co więcej, IE staje się wolniejszy i wolniejszy im dłuższy jest Twój ciąg.

Jeśli masz długie łańcuchy do konkatenacji, zdecydowanie użyj tablicy.technika przyłączenia. (Lub jakąś owijkę StringBuffer wokół tego, dla czytelności.) Ale jeśli twoje struny są krótkie, nie kłopocz się.

 46
Author: pcorcoran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 20:25:10

Twój przykład nie jest dobry, ponieważ jest bardzo mało prawdopodobne, że wydajność będzie znacznie inna. W twoim przykładzie czytelność powinna przewyższać wydajność, ponieważ przyrost wydajności jednego vs drugiego jest niedbały. Korzyści z tablicy (StringBuffer) są widoczne tylko wtedy, gdy robisz wiele konkatenacji. Nawet wtedy przebieg może bardzo zależeć od przeglądarki.

Oto szczegółowa analiza wydajności, która pokazuje wydajność przy użyciu wszystkich różnych Metody konkatenacji JavaScript w wielu różnych przeglądarkach; String Performance an Analysis

join () once, concat() once, join() for, + = for, concat () for

Więcej:
Ajaxian > > String Performance in IE: Array.join vs + = continued

 102
Author: Eric Schoonover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 00:58:08

Tak, to prawda, ale nie powinno cię to obchodzić. Wybierz ten, który jest łatwiejszy do odczytania. Jeśli musisz przetestować swoją aplikację, skup się na wąskich gardłach.

Domyślam się, że konkatenacja łańcuchów nie będzie twoim wąskim gardłem.

 36
Author: Michael Haren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:06:21

Zgodził się z Michaelem Harenem .

Rozważ również użycie tablic i połącz, jeśli wydajność jest rzeczywiście problemem.

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));
 30
Author: Frank Krueger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:12

Spróbuj tego:

var s = ["<a href='", url, "'>click here</a>"].join("");
 18
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:08:14

JavaScript nie ma natywnego obiektu StringBuffer, więc zakładam, że jest to z biblioteki, której używasz, lub cecha nietypowego środowiska hosta(tj. nie przeglądarki).

Wątpię, by biblioteka (napisana w JS) produkowała coś szybciej, chociaż natywny obiekt StringBuffer mógłby. Ostateczną odpowiedź można znaleźć za pomocą profilera (jeśli pracujesz w przeglądarce, to Firebug dostarczy Ci profiler dla silnika JS znalezionego w Firefoksie).

 8
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:08:28

Jak już zauważyli niektórzy użytkownicy: jest to nieistotne dla małych łańcuchów.

I nowe silniki JavaScript w Firefoksie, Safari czy Google Chrome optymalizują tak

"<a href='" + url + "'>click here</a>";

Jest tak szybki jak

["<a href='", url, "'>click here</a>"].join("");
 7
Author: amix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:20:39

Według słów Knutha, " przedwczesna optymalizacja jest korzeniem wszelkiego zła!"Mała defference tak czy inaczej najprawdopodobniej nie będzie miała dużego efektu w końcu; wybrałbym ten bardziej czytelny.

 6
Author: William Keller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:19:26

Łatwiejsza do odczytania metoda oszczędza ludziom dostrzegalne ilości czasu podczas patrzenia na kod, podczas gdy" szybsza " metoda marnuje tylko niedostrzegalne i prawdopodobnie znikome ilości czasu, gdy ludzie przeglądają stronę.

Wiem, że ten post jest lamerski, ale przypadkowo wrzuciłem coś zupełnie innego myśląc, że to inny wątek i nie wiem jak usuwać posty. Mój błąd...

 4
Author: Ed Kern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 09:05:04

Łatwo jest skonfigurować szybki benchmark i sprawdzić zmiany wydajności Javascript za pomocą jspref.com . którego prawdopodobnie nie było w pobliżu, gdy zadano to pytanie. Ale dla ludzi, którzy natkną się na to pytanie, powinni zajrzeć na stronę.

Zrobiłem szybki test różnych metod konkatenacji na http://jsperf.com/string-concat-methods-test .

 3
Author: James McMahon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 20:42:40

Lubię używać stylów funkcjonalnych, takich jak:

function href(url,txt) {
  return "<a href='" +url+ "'>" +txt+ "</a>"
}

function li(txt) {
  return "<li>" +txt+ "</li>"
}

function ul(arr) {
  return "<ul>" + arr.map(li).join("") + "</ul>"
}

document.write(
  ul(
    [
      href("http://url1","link1"),
      href("http://url2","link2"),
      href("http://url3","link3")
    ]
  )
)

Ten styl wygląda na czytelny i przejrzysty. Prowadzi to do tworzenia narzędzi, co zmniejsza powtarzalność w kodzie.

To również ma tendencję do automatycznego używania łańcuchów pośrednich.

 2
Author: jasonc65,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 04:14:27

Z tego co wiem, każda konkatenacja implikuje realokację pamięci. Więc problemem nie jest operator używany do tego, rozwiązaniem jest zmniejszenie liczby konkatenacji. Na przykład wykonaj konkatenacje poza strukturami iteracji, gdy tylko możesz.

 1
Author: David Ameller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:12:35

Tak, zgodnie ze zwykłymi benchmarkami. E. g: http://mckoss.com/jscript/SpeedTrial.htm .

Ale dla małych ciągów jest to nieistotne. Zależy Ci tylko na występach na bardzo dużych strunach. Co więcej, w większości skryptów JS szyjka butelki jest rzadko na manipulacji ciągiem, ponieważ nie ma jej wystarczająco dużo.

Lepiej uważaj na manipulacje domami.

 0
Author: e-satis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 21:10:06