Der effizienteste Weg, um Strings in JavaScript zu verketten?


163

In JavaScript habe ich eine Schleife mit vielen Iterationen, und in jeder Iteration erstelle ich eine große Zeichenfolge mit vielen +=Operatoren. Gibt es eine effizientere Möglichkeit, eine Zeichenfolge zu erstellen? Ich habe darüber nachgedacht, ein dynamisches Array zu erstellen, in dem ich immer wieder Zeichenfolgen hinzufüge und dann einen Join mache. Kann jemand erklären und ein Beispiel geben, wie dies am schnellsten geht?


2
Wofür verwenden Sie die Zeichenfolge? Alle diesbezüglichen Leistungstipps hängen von Ihrer Umgebung, der Größe Ihrer Saiten, der Optimierung verschiedener Vorgänge durch eine bestimmte JS-Engine usw. ab.
Ben McCormick,


5
Prüfen Sie diesen Link jsperf.com/join-concat/2
rab

Ich verwende IE9, aber es befindet sich im IE8-Kompatibilitätsmodus (den ich nicht ändern kann). Die riesige Zeichenfolge werde ich mit jquery in das DOM einfügen.
Omega

Antworten:


135

Scheint basierend auf Benchmarks bei JSPerf, dass die Verwendung +=die schnellste Methode ist, wenn auch nicht unbedingt in jedem Browser.

Zum Erstellen von Zeichenfolgen im DOM scheint es besser zu sein, die Zeichenfolge zuerst zu verketten und dann zum DOM hinzuzufügen, anstatt sie iterativ zum Dom hinzuzufügen. Sie sollten jedoch Ihren eigenen Fall bewerten.

(Danke @zAlbee für die Korrektur)


1
Schauen Sie in die verlinkte Seite. Es scheint kaum einen Unterschied zu geben, ob +=ein Array verknüpft wird oder nicht.
Jakub Hampl

Es scheint, dass das Hinzufügen zum DOM für jede Zeichenfolge 66%(für IE9) schneller ist als das Erstellen einer Zeichenfolge und das anschließende Hinzufügen der Zeichenfolge zum DOM.
Omega

Die verlinkte Seite verwendet + = für beide Tests, ohne dass .join () in Sicht ist. Es handelt sich also um einen bedeutungslosen Test, bei dem nur Rauschen als "Unterschied" angezeigt wird. gutes Beispiel dafür, wie laut js sein kann ... dom ist langsamer als string, also benutze es sparsam.
Dandavis

Zeit ist nur eine Komponente. Bei iterativen Routinen frage ich mich, welche Auswirkungen die verschiedenen Methoden auf die GC haben.
David Bradley

Für große Strings kann array.join aufgrund des sehr unangenehmen Speicherfehlers von string concat vorzuziehen sein bugs.chromium.org/p/v8/issues/detail?id=3175
mwag

70

Ich habe keinen Kommentar zur Verkettung selbst, möchte aber auf den Vorschlag von @Jakub Hampl hinweisen:

In einigen Fällen ist es zum Erstellen von Zeichenfolgen im DOM möglicherweise besser, iterativ zum DOM hinzuzufügen, als sofort eine große Zeichenfolge hinzuzufügen.

ist falsch, weil es auf einem fehlerhaften Test basiert. Dieser Test wird nie an das DOM angehängt.

Dieser feste Test zeigt, dass das Erstellen der Zeichenfolge auf einmal vor dem Rendern viel, VIEL schneller ist. Es ist nicht einmal ein Wettbewerb.

(Entschuldigung, dies ist eine separate Antwort, aber ich habe noch nicht genug Vertreter, um die Antworten zu kommentieren.)


4
Ich denke, es lohnt sich, eine Antwort auf sich selbst zu sein, da sie einen Test und eine Schlussfolgerung enthält (obwohl der Test auf einer anderen Antwort basiert / inspiriert ist, sollte das in Ordnung sein), ohne dass es einer Entschuldigung bedarf.
user202729

14

Vor drei Jahren, seit diese Frage beantwortet wurde, werde ich meine Antwort trotzdem geben :)

Tatsächlich ist die akzeptierte Antwort nicht vollständig korrekt. Jakubs Test verwendet eine fest codierte Zeichenfolge, mit der die JS-Engine die Codeausführung optimieren kann (Googles V8 ist in diesem Bereich wirklich gut!). Sobald Sie jedoch vollständig zufällige Zeichenfolgen verwenden ( hier ist JSPerf ), steht die Verkettung der Zeichenfolgen an zweiter Stelle.


Interessanterweise ist concat mit Chrome 54 und Firefox 45 auf meinem Windows-Computer mehr als doppelt so schnell wie die beiden anderen, die Ihre Version verwenden. IE 11 hat alle drei so langsam wie das Nicht-Concat in den beiden anderen Browsern.
ShawnFumo

4
Es ist von Version zu Version unterschiedlich. Ich denke, im Moment könnte die VM von Chrome eine Voroptimierung für diesen Fall enthalten. Ich habe erneut auf Chrome v53 getestet und die Verkettung ist jetzt die schnellste Lösung: D Gleiche Hardware, aber unterschiedliche Chrome-Versionen liefern völlig unterschiedliche Ergebnisse.
Volodymyr Usarskyy

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.