+ String运算符的性能低于StringBuffer.append()

时间:2008-09-21 21:04:35

标签: javascript string concatenation

在我的团队中,我们通常会像这样进行字符串连接:

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 个答案:

答案 0 :(得分:102)

你的例子并不是一个好的例子,因为表现不太可能显着不同。在您的示例中,可读性应该优于性能,因为一个与另一个的性能增益可以忽略不计。只有在进行多次连接时,数组(StringBuffer)的好处才会显而易见。即使这样,你的里程也很大程度上取决于你的浏览器。

这是一个详细的性能分析,它显示了在许多不同浏览器中使用所有不同JavaScript连接方法的性能; String Performance an Analysis

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

更多:
Ajaxian >> String Performance in IE: Array.join vs += continued

答案 1 :(得分:46)

Internet Explorer是当今世界上唯一真正受此影响的浏览器。 (版本5,6和7是狗慢.8没有显示相同的退化。)而且,你的字符串越长,IE越来越慢。

如果你有连接的长字符串,那么肯定使用array.join技术。 (或者为了便于阅读,可以使用一些StringBuffer包装。)但如果你的字符串很短,请不要打扰。

答案 2 :(得分:37)

是的,这是真的,但你不应该在乎。选择一个更容易阅读的。如果您必须对应用程序进行基准测试,请关注瓶颈。

我猜猜字符串连接不会成为你的瓶颈。

答案 3 :(得分:31)

同意Michael Haren

如果性能确实存在问题,还要考虑使用数组和连接。

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));

答案 4 :(得分:18)

试试这个:

var s = ["<a href='", url, "'>click here</a>"].join("");

答案 5 :(得分:8)

JavaScript没有本机StringBuffer对象,所以我假设这是来自您正在使用的库,或者是不寻常的主机环境(即不是浏览器)的功能。

我怀疑一个库(用JS编写)会产生更快的速度,尽管可能是原生的StringBuffer对象。使用分析器可以找到明确的答案(如果您在浏览器中运行,那么Firebug将为您提供Firefox中的JS引擎的分析器)。

答案 6 :(得分:7)

就像一些用户已经注意到的那样:这与小字符串无关。

Firefox,Safari或Google Chrome中的新JavaScript引擎优化

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

一样快
["<a href='", url, "'>click here</a>"].join("");

答案 7 :(得分:6)

用Knuth的话说,“过早的优化是万恶之源!”任何一种方式的微小差异最终都不会产生太大影响;我会选择更具可读性的。

答案 8 :(得分:4)

更容易阅读的方法在查看代码时可以节省人们可观察的时间,而“更快”的方法只会浪费人们浏览页面时难以察觉的可能时间。

我知道这篇文章是蹩脚的,但我不小心发布了一些完全不同的东西,认为这是一个不同的主题,我不知道如何删除帖子。我的坏......

答案 9 :(得分:3)

使用jspref.com设置快速基准并检查Javascript性能变化非常简单。当问到这个问题时,可能还没有。但对于那些在这个问题上磕磕绊绊的人来说,他们应该在网站上采取行动。

我在http://jsperf.com/string-concat-methods-test对各种连接方法进行了快速测试。

答案 10 :(得分:2)

我喜欢使用功能样式,例如:

function href(url,txt) {
  return "<a href='" +url+ "'>" +txt+ "</a>"
}

function li(txt) {
  return "<li>" +txt+ "</li>"
}

function ul(arr) {
  return "<ul>" + arr.map(li).join("") + "</ul>"
}

document.write(
  ul(
    [
      href("http://url1","link1"),
      href("http://url2","link2"),
      href("http://url3","link3")
    ]
  )
)

此样式看起来可读且透明。它导致创建实用程序,减少代码中的重复。

这也倾向于自动使用中间字符串。

答案 11 :(得分:1)

据我所知,每个连接都意味着内存重新分配。所以问题不在于操作员习惯这样做,解决方案是减少连接数。例如,尽可能在迭代结构之外进行连接。

答案 12 :(得分:0)

是的,根据通常的基准测试。 E.G:http://mckoss.com/jscript/SpeedTrial.htm

但对于小字符串,这是无关紧要的。你只关心非常大的弦乐表演。更重要的是,在大多数JS脚本中,瓶颈很少用于字符串操作,因为它没有足够的。

你最好看看DOM操作。