Скорость конкатенации строк JavaScript - PullRequest
5 голосов
/ 01 июля 2011

Может кто-нибудь объяснить мне это:

http://jsperf.com/string-concatenation-1/2

Если вы ленивый, я проверил А) против Б):

А)

var innerHTML = "";

items.forEach(function(item) {
    innerHTML += item;
});

B)

var innerHTML = items.join("");

Где items для обоих тестов - это один и тот же массив строк из 500 элементов, причем каждая строка случайна и имеет длину от 100 до 400 символов.

A) заканчивается в 10 раз быстрее. Как это может быть - я всегда думал, что конкатенация с использованием join("") была уловкой оптимизации. Что-то не так с моими тестами?

Ответы [ 2 ]

8 голосов
/ 01 июля 2011

Использование join("") было уловкой оптимизации для составления больших строк в IE6, чтобы избежать O(n**2) буферных копий. Никогда не ожидалось, что это будет огромный выигрыш в производительности для составления небольших строк, поскольку O(n**2) действительно доминирует только над издержками массива для больших n.

Современные интерпретаторы обходят это, используя «зависимые строки». См. Эту ошибку Mozilla для объяснения зависимых строк и некоторых преимуществ и недостатков.

В основном современные интерпретаторы знают о множестве различных типов строк:

  1. Массив символов
  2. Срез (подстрока) другой строки
  3. Объединение двух других строк

Это делает конкатенацию и подстроку O (1) ценой того, что иногда остается слишком много живого подстрокового буфера, что приводит к неэффективности или сложности в сборщике мусора.

Некоторые современные интерпретаторы поиграли с идеей дальнейшего разложения (1) на байты [] для строк только в ASCII и массивы uint16s, когда строка содержит кодовую единицу UTF-16, которая не может вписаться в один байт. , Но я не знаю, есть ли эта идея в каком-либо переводчике.

1 голос
/ 01 июля 2011

Здесь автор языка программирования Lua объясняет издержки буфера , о которых говорит @Mike Samuel. Примеры в Lua, но проблема та же в JavaScript.

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