Javascript String конкатенация быстрее, чем в этом примере? - PullRequest
7 голосов
/ 30 сентября 2008

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

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

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

Ответы [ 7 ]

15 голосов
/ 30 сентября 2008

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

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

13 голосов
/ 30 сентября 2008

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

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

до

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

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

Привет.

1 голос
/ 30 сентября 2008

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

1 голос
/ 30 сентября 2008

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

1 голос
/ 30 сентября 2008

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

0 голосов
/ 01 октября 2008

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

0 голосов
/ 30 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...