Il modo più efficiente per concatenare le stringhe in JavaScript?


163

In JavaScript, ho un ciclo che ha molte iterazioni e in ogni iterazione sto creando una stringa enorme con molti +=operatori. Esiste un modo più efficiente per creare una stringa? Stavo pensando di creare un array dinamico in cui continuo ad aggiungere stringhe e quindi a fare un join. Qualcuno può spiegare e dare un esempio del modo più veloce per farlo?


2
Per cosa stai usando la stringa? Eventuali suggerimenti sulle prestazioni possono variare in base all'ambiente, alle dimensioni delle stringhe, al modo in cui un particolare motore js ottimizza diverse operazioni, ecc.
Ben McCormick,

1
può essere duplicato di stackoverflow.com/questions/7299010/…
rab

5
Controlla questo link jsperf.com/join-concat/2
rab

Sto usando IE9 ma è in modalità di compatibilità IE8 (che non posso cambiare). L'enorme stringa è qualcosa che inserirò nel DOM usando jquery.
Omega

Risposte:


135

Sembra basato sui benchmark di JSPerf che l'utilizzo +=sia il metodo più veloce, sebbene non necessariamente in tutti i browser.

Per la creazione di stringhe nel DOM, sembra meglio concatenare prima la stringa e quindi aggiungerla al DOM, anziché aggiungerla iterativamente al dom. Dovresti confrontare il tuo caso però.

(Grazie @zAlbee per la correzione)


1
Guarda nella pagina collegata. Sembra che ci sia poca differenza tra +=e fare un join su un array.
Jakub Hampl,

Sembra che aggiungerlo al DOM per ogni stringa sia 66%(per IE9) più veloce della creazione di una stringa e quindi aggiungere la stringa al DOM.
Omega

la pagina collegata utilizza + = per entrambi i test, nessun .join () in vista, quindi è un test privo di significato che mostra solo il rumore come qualsiasi "differenza". buon esempio di come js rumoroso possa essere però ... dom è più lento della stringa, quindi usalo con parsimonia.
dandavis,

Il tempo non è che un componente. Per le routine iterative, mi chiedo quale sia l'impatto sul GC tra i vari metodi?
David Bradley,

Per stringhe di grandi dimensioni, array.join potrebbe essere preferibile a causa dei bug di memoria molto spiacevoli di concat string bugs.chromium.org/p/v8/issues/detail?id=3175
mwag

70

Non ho commenti sulla stessa concatenazione, ma vorrei sottolineare che il suggerimento di @Jakub Hampl:

Per la creazione di stringhe nel DOM, in alcuni casi potrebbe essere meglio aggiungere iterativamente al DOM, piuttosto che aggiungere una stringa enorme contemporaneamente.

è sbagliato, perché si basa su un test errato. Quel test non viene mai effettivamente aggiunto al DOM.

Questo test fisso mostra che creare la stringa tutta in una volta prima di renderla è molto, MOLTO più veloce. Non è nemmeno una gara.

(Mi dispiace, questa è una risposta separata, ma non ho ancora abbastanza rappresentante per commentare le risposte.)


4
Penso che valga la pena essere una risposta su se stessa perché contiene un test e una conclusione (anche se il test è basato / ispirato su un'altra risposta, che dovrebbe essere ok), non c'è bisogno di scusarsi.
user202729

14

Tre anni dopo la risposta a questa domanda, ma fornirò comunque la mia risposta :)

In realtà, la risposta accettata non è completamente corretta. Il test di Jakub utilizza una stringa hardcoded che consente al motore JS di ottimizzare l'esecuzione del codice (il V8 di Google è davvero buono in questa roba!). Ma non appena si utilizzano stringhe completamente casuali ( qui è JSPerf ), la concatenazione delle stringhe sarà al secondo posto.


È interessante notare che con Chrome 54 e Firefox 45 sul mio computer Windows, concat è più del doppio rispetto agli altri due che utilizzano la tua versione. IE 11 ha tutte e tre le lenti quanto il non-concat negli altri due browser.
ShawnFumo,

4
È diverso da versione a versione. Immagino, in questo momento la VM di Chrome potrebbe contenere una pre-ottimizzazione per questo caso. Ho provato di nuovo su Chrome v53 e la concatenazione è ora la soluzione più veloce: D Stesso hardware ma versione Chrome diversa offre risultati totalmente diversi.
Volodymyr Usarskyy,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.