Конкатенация строк в Javascript быстрее, чем в этом примере?

Мне нужно объединить кучу строк в 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(”));

Не обращайте внимания на цикл или другой «сложный» код, из которого строится пример.

Мой вопрос: для неизвестного количества строк, есть ли у вас более быстрый алгоритм / метод / идея для объединения множества маленьких строк в одну огромную?


person Georgi    schedule 30.09.2008    source источник


Ответы (7)


Изменение строки:

sbuffer.push(‘Data comes here... bla... ’);

to

sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;

даст прирост скорости 5-50% (в зависимости от браузера, в IE - прирост будет максимальным)

С Уважением.

person Sergey Ilinsky    schedule 30.09.2008
comment
У вас есть какой-нибудь источник статистики по этому поводу? Я бы подумал, что штраф за проверку длины на каждой итерации (либо в push, либо в array.length) будет работать одинаково. Я, конечно, знаю, что скорость конкатенации строк в IE оставляет желать лучшего. - person scunliffe; 16.05.2009

На вопрос Конкатенация строк JavaScript есть принятый ответ, который ссылается на очень хорошее сравнение производительности конкатенации строк в JavaScript.

Изменить: я бы подумал, что вы можете добиться немного большей производительности, используя устройство Даффа, как предлагается в статье.

person Sam Hasler    schedule 30.09.2008
comment
Привет, Сэм, я видел этот пост раньше, но мой вопрос немного отличается по поведению, и я действительно спрашиваю, есть ли у кого-то более быстрое решение, и не только пытается сравнить конкатенацию с соединением. Кто знает? Возможно, есть другое решение, более быстрое для огромных строк. - person Georgi; 30.09.2008

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

person Tomalak    schedule 30.09.2008
comment
Да, на самом деле производительность Javascript имеет большое преимущество для работы на многих клиентских машинах, а не только на одном сервере - разделяйте и империю ;-). Но с усложнением клиентских сценариев производительность также становится проблемой. Вопрос: Что означает YMMV? - person Georgi; 30.09.2008
comment
@Georgi: Ваш пробег может отличаться - person Chris Cudmore; 30.09.2008
comment
Ваш пробег может отличаться. Google тоже ваш друг. ;-) - person Tomalak; 30.09.2008

Я думаю, что размещение строк в массиве с последующим присоединением к нему - это самый быстрый метод конкатенации строк в JavaScript. В этом обсуждении W3C DOM и innerHTML есть некоторые подтверждающие доказательства. Обратите внимание на разницу между результатами innerHTML 1 и innerHTML 2.

person John Topley    schedule 30.09.2008

Насколько мне известно, ваш алгоритм хорош и известен как эффективное решение проблемы конкатенации строк.

person Barth    schedule 30.09.2008

Остерегайтесь плохого сборщика мусора IE! Что вы собираетесь делать со своим массивом после использования? Возможно, он получит сборку мусора?

Вы можете получить производительность при объединении с объединениями, а затем потерять при сборке после сборки мусора. С другой стороны, если вы все время оставляете массив в области видимости и НЕ используете его повторно, это может быть хорошим решением.

Лично я хотел бы самое простое решение: просто использовать оператор + =.

person Thevs    schedule 30.09.2008

Вы можете получить немного больше скорости, используя буферизацию.

person Andrew Hedges    schedule 01.10.2008
comment
Извините, это не помогает, потому что количество объединяемых строк неизвестно (для неизвестного количества строк ...). Я тоже думал о буферизации, но это сильно увеличит объем памяти и сборку мусора. - person Georgi; 01.10.2008