Найефективніший спосіб об'єднання рядків у JavaScript?


163

У JavaScript у мене є цикл, який має багато ітерацій, і в кожній ітерації я створюю величезну рядок з багатьма +=операторами. Чи є більш ефективний спосіб створити рядок? Я думав над створенням динамічного масиву, де я постійно додаю до нього рядки, а потім виконую з'єднання. Хтось може пояснити та навести приклад найшвидшого способу зробити це?


2
Для чого ви використовуєте рядок? Будь-які поради щодо ефективності цього варіанту залежать від вашого оточення, розмірів ваших рядків, того, як певний js-движок оптимізує різні операції тощо.
Бен Маккормік

1
може бути дублікатом stackoverflow.com/questions/7299010/…
раб

5
Перевірте це посилання jsperf.com/join-concat/2
раб

Я використовую IE9, але його в режимі сумісності IE8 (який я не можу змінити). Величезна рядок - це те, що я вставляю в DOM за допомогою jquery.
омега

Дивіться також зв'язок рядків JavaScript
Бергі,

Відповіді:


135

Здається, що на основі орієнтирів JSPerf базується, що використання +=- це найшвидший метод, але не обов'язково у кожному браузері.

Для побудови рядків у DOM здається, що краще спочатку об'єднати рядок, а потім додати до DOM, а не потім ітеративно додати його до dom. Однак ви повинні орієнтувати свій власний випадок.

(Дякую @zAlbee за виправлення)


1
Загляньте на пов’язану сторінку. Здається, що між різницею +=та виконанням з'єднання на масиві є невелика різниця .
Якуб Гампл

Здається, додавання його до DOM для кожної рядки 66%(для IE9) швидше, ніж створення його рядка, а потім додавання рядка до DOM.
омега

на пов’язаній сторінці використовується + = для обох тестів, немає .join () в поле зору, тому це безглуздий тест, який показує лише шум як будь-яку "різницю". Хороший приклад того, як галасливий js може бути, хоча ... dom повільніше, ніж рядок, тому використовуйте його економити
dandavis

Час - це лише одна складова. Що стосується ітеративних процедур, мені цікаво, який вплив на GC має між різними методами?
Девід Бредлі

Для великих рядків array.join може бути кращим через дуже неприємну помилку пам’яті concat.chromium.org/p/v8/isissue/detail?id=3175
mwag

70

Я не маю коментарів щодо самого конкатенації, але хочу зазначити, що пропозиція @Jakub Hampl:

Для побудови рядків у DOM в деяких випадках може бути краще ітеративно додавати до DOM, а не додавати відразу величезну рядок.

є неправильним, оскільки він заснований на хибному тесті. Цей тест насправді ніколи не додається до DOM.

Цей фіксований тест показує, що створення рядка відразу заздалегідь перед його наданням набагато швидше. Це навіть не конкурс.

(Вибачте, це окрема відповідь, але у мене ще недостатньо респондентів, щоб коментувати відповіді.)


4
Я думаю, що варто відповісти на себе, тому що він містить тест і висновок (хоча тест заснований / натхненний на іншу відповідь, це повинно бути нормально), не потрібно шкода.
користувач202729

14

Минуло три роки з моменту відповіді на це запитання, але я все одно надам свою відповідь :)

Власне, прийнята відповідь не є повністю коректною. У тесті Якуба використовується жорстко кодована рядок, яка дозволяє двигуну JS оптимізувати виконання коду (V8 Google справді хороший у цьому матеріалі!). Але як тільки ви використовуєте повністю випадкові рядки ( ось JSPerf ), то конкатенація рядків буде на другому місці.


Цікаво, що в Chrome 54 та Firefox 45 на моїй машині Windows, concat більш ніж удвічі швидший, ніж інші два, які використовують вашу версію. У IE 11 усі три такі ж повільні, як і в інших браузерах.
ShawnFumo

4
Він відрізняється від версії до версії. Я здогадуюсь, саме зараз VM Chrome може містити деяку попередню оптимізацію для цього випадку. Я знову перевірив Chrome v53, і конкатенація - це найшвидше рішення: D Те саме апаратне забезпечення, але інша версія Chrome дає абсолютно різні результати.
Володимир Усарський

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.