оператор + менее производительный, чем StringBuffer.append () - PullRequest
89 голосов
/ 22 сентября 2008

В моей команде мы обычно выполняем конкатенацию строк следующим образом:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

Очевидно, что следующее гораздо более читабельно:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

Но эксперты JS утверждают, что оператор + менее производителен, чем StringBuffer.append(). Это правда?

Ответы [ 13 ]

102 голосов
/ 22 сентября 2008

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

Вот подробный анализ производительности, который показывает производительность с использованием всех различных методов конкатенации JavaScript во многих различных браузерах; Строковый анализ производительности

join() once, concat() once, join() for, += for, concat() for

Подробнее:
Ajaxian >> Производительность строк в IE: Array.join vs + = продолжение

46 голосов
/ 22 сентября 2008

Internet Explorer - единственный браузер, который действительно страдает от этого в современном мире. (Версии 5, 6 и 7 были очень медленными. 8 не показывает такое же ухудшение.) Более того, IE становится все медленнее и медленнее, чем длиннее ваша строка.

Если вам нужно объединить длинные строки, то обязательно используйте технику array.join. (Или некоторую оболочку StringBuffer вокруг этого для удобства чтения.) Но если ваши строки короткие, не беспокойтесь.

37 голосов
/ 22 сентября 2008

Да, это правда, но вам все равно. Перейти с тем, что легче читать. Если вам нужно сравнить свои приложения, тогда сосредоточьтесь на узких местах.

Я полагаю, что конкатенация строк не станет вашим узким местом.

31 голосов
/ 22 сентября 2008

Договорились с Майклом Хареном .

Также рассмотрите возможность использования массивов и присоединитесь, если производительность действительно является проблемой.

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));
18 голосов
/ 22 сентября 2008

Попробуйте это:

var s = ["<a href='", url, "'>click here</a>"].join("");
8 голосов
/ 22 сентября 2008

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

Я сомневаюсь, что библиотека (написанная на JS) выдаст что-нибудь быстрее, хотя это может сделать нативный объект StringBuffer. Окончательный ответ можно найти с помощью профилировщика (если вы работаете в браузере, Firebug предоставит вам профилировщик для движка JS, найденного в Firefox).

7 голосов
/ 22 сентября 2008

Как уже отмечали некоторые пользователи: это не имеет значения для маленьких строк.

И новые движки JavaScript в Firefox, Safari или Google Chrome оптимизируют так, чтобы

"<a href='" + url + "'>click here</a>";

так же быстро, как

["<a href='", url, "'>click here</a>"].join("");
6 голосов
/ 22 сентября 2008

По словам Кнута, "преждевременная оптимизация - корень всего зла!" Небольшое отклонение в любом случае, скорее всего, не окажет большого влияния в конце; Я бы выбрал более читаемый.

4 голосов
/ 03 декабря 2012

Более легкий для чтения метод экономит воспринимаемое человеком количество времени при просмотре кода, тогда как "более быстрый" метод тратит только незаметное и, вероятно, незначительное количество времени, когда люди просматривают страницу.

Я знаю, что это сообщение отстой, но я случайно опубликовал что-то совершенно другое, думая, что это была другая тема, и я не знаю, как удалять сообщения. Мой плохой ...

3 голосов
/ 22 сентября 2012

Довольно просто настроить быстрый тест и проверить изменения производительности Javascript с помощью jspref.com . Которого, вероятно, не было рядом, когда был задан этот вопрос. Но для людей, спотыкающихся в этом вопросе, они должны взглянуть на сайт.

Я провел быструю проверку различных методов объединения в http://jsperf.com/string-concat-methods-test.

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