Самый эффективный способ объединения строк в JavaScript?


163

В JavaScript у меня есть цикл, который имеет много итераций, и на каждой итерации я создаю огромную строку со многими +=операторами. Есть ли более эффективный способ создания строки? Я думал о создании динамического массива, где я продолжаю добавлять строки к нему, а затем делаю соединение. Может кто-нибудь объяснить и привести пример самого быстрого способа сделать это?


2
Для чего вы используете строку? Любые советы по производительности будут варьироваться в зависимости от вашей среды, размеров ваших строк, того, как конкретный движок js оптимизирует различные операции и т. Д.
Бен Маккормик,

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

5
Проверьте эту ссылку jsperf.com/join-concat/2
раб

Я использую IE9, но в режиме совместимости IE8 (который я не могу изменить). Огромная строка - это то, что я вставлю в DOM, используя jquery.
Омега

Ответы:


135

На основании тестов в JSPerf кажется, что использование +=- самый быстрый метод, хотя не обязательно в каждом браузере.

Для построения строк в DOM, кажется, лучше сначала конкатенировать строку, а затем добавить в DOM, а не итеративно добавлять ее в DOM. Вы должны сравнить свой собственный случай, хотя.

(Спасибо @zAlbee за исправление)


1
Посмотрите на связанную страницу. Кажется, что есть небольшая разница между +=выполнением соединения с массивом.
Якуб Хэмпл

Кажется, что добавление его в DOM для каждой строки 66%(для IE9) происходит быстрее, чем создание строки и добавление этой строки в DOM.
Омега

связанная страница использует + = для обоих тестов, но .join () не видно, так что это бессмысленный тест, который показывает только шум как любую «разницу». хороший пример того, насколько шумным может быть js ... dom медленнее, чем string, поэтому используйте его с осторожностью.
Дандавис

Время - это всего лишь один компонент. Интересно, что за итеративные процедуры влияют на сборку мусора между различными методами?
Дэвид Брэдли

Для больших строк, array.join может быть предпочтительнее из-за очень неприятной ошибки памяти concat
строки

70

У меня нет комментариев относительно самой конкатенации, но я хотел бы отметить, что предложение @Jakub Hampl:

Для построения строк в DOM в некоторых случаях может быть лучше итеративно добавить в DOM, чем сразу добавлять огромную строку.

неправильно, потому что он основан на некорректном тесте. Этот тест никогда не добавляется в DOM.

Этот фиксированный тест показывает, что создание строки сразу перед ее рендерингом намного, НАМНОГО быстрее. Это даже не конкурс.

(Извините, это отдельный ответ, но у меня недостаточно представителей, чтобы комментировать ответы.)


4
Я думаю, что это стоит того, чтобы быть ответом на себя, потому что он содержит тест и заключение (хотя тест основан / вдохновлен на другом ответе, это должно быть хорошо), нет нужды сожалеть.
user202729

14

Прошло три года с тех пор, как на этот вопрос был дан ответ, но я все равно предоставлю свой ответ :)

На самом деле принятый ответ не совсем правильный. Тест Якуба использует жестко закодированную строку, которая позволяет движку JS оптимизировать выполнение кода (Google V8 действительно хорош в этом!). Но как только вы используете совершенно случайные строки ( здесь - JSPerf ), конкатенация строк будет на втором месте.


Интересно, что с Chrome 54 и Firefox 45 на моей машине с Windows concat более чем в два раза быстрее, чем две другие, использующие вашу версию. IE 11 имеет все три медленнее, чем non-concat в двух других браузерах.
ShawnFumo

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.