Конкатенация строк Javascript быстрее, чем в этом примере?
-
03-07-2019 - |
Вопрос
Мне нужно объединить кучу строк в Javascript, и я ищу самый быстрый способ сделать это.Давайте предположим, что Javascript должен создать большой XML-"файл", который, естественно, состоит из множества маленьких строк.Итак, я придумал:
var sbuffer = [];
for (var idx=0; idx<10000; idx=idx+1) {
sbuffer.push(‘<xmltag>Data comes here... bla... </xmltag>’);
}
// Now we "send" it to the browser...
alert(sbuffer.join(”));
Не обращайте никакого внимания на цикл или другой "сложный" код, который создает пример.
Мой вопрос заключается в следующем:Для неизвестного количества строк, есть ли у вас более быстрый алгоритм / метод / идея объединить множество маленьких строк в огромную?
Решение
Изменение линии:
sbuffer.push(‘Data comes here... bla... ’);
Для
sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;
даст вам прирост скорости на 5-50% (в зависимости от браузера, в IE - прирост будет самым высоким)
С уважением.
Другие советы
Этот вопрос Конкатенация строк JavaScript имеет принятый ответ, который ссылается на очень хорошее сравнение производительности конкатенации строк JavaScript.
Редактировать: Я бы подумал, что вы могли бы добиться немного большей производительности, используя устройство Даффа, как предлагается в статье.
Я думаю, что вы довольно близки к оптимуму.YMMV, большая скорость достигается или теряется в движке JavaScript хост-процесса (напримербраузер).
Я думаю, что перенос строк в массив и последующее объединение массива - это самый быстрый метод конкатенации строк в JavaScript.В этом есть некоторые подтверждающие доказательства дискуссия о W3C DOM противinnerHTML.Обратите внимание на разницу между результатами innerHTML 1 и innerHTML 2.
Насколько я знаю, ваш алгоритм хорош и известен как эффективное решение проблемы конкатенации строк.
Остерегайтесь IE bad garbage collector!Что вы предполагаете делать с вашим массивом после использования?Вероятно, он получит GC'd?
Вы можете получить преимущество при объединении с помощью joins, а затем потерять при последующей сборке.С другой стороны, если вы все время оставляете массив в области видимости и НЕ используете его повторно, это может быть хорошим решением.
Лично я хотел бы найти самое простое решение:просто для того, чтобы использовать оператор +=.
Возможно, вы наберете немного больше скорости, если буферизация.