是+运算符性能比StringBuffer.append()less

在我的团队中,我们通常会像这样进行string联合:

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() 。 这是真的吗?

Internet Explorer是当今世界唯一真正遭受这种困扰的浏览器。 (版本5,6和7是慢的,8不会显示相同的降级。)更重要的是,IE越来越慢,越长越好。

如果你有很长的string连接然后肯定使用array.join技术。 (或者一些StringBuffer包装在这里,为了可读性。)但是如果你的string很短,不要打扰。

你的榜样不是一个好的例子,它的performance不太可能会有明显的不同。 在你的例子中,可读性应该胜过性能,因为一个和另一个的性能增益是可忽略的。 数组(StringBuffer)的好处只有在你进行多个连接时才会显而易见。 即使这样你的里程可以非常依赖于你的浏览器。

下面是一个详细的性能分析,它显示了在许多不同的浏览器中使用所有不同的JavaScript连接方法的性能。 string性能分析

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

更多:
Ajaxian >>在IE中的string性能:Array.join vs + = continue

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

我猜想string连接不会成为你的瓶颈。

同意Michael Haren 。

如果性能确实是一个问题,那么还要考虑使用数组和join。

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

尝试这个:

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

JavaScript没有一个本地的StringBuffer对象,所以我假定这是来自你正在使用的库,或者一个不寻常的主机环境(即不是浏览器)的function。

我怀疑一个库(用JS编写)会产生更快的东西,尽pipe本地的StringBuffer对象可能会更快。 如果您正在浏览器中运行,那么Firebug会为您提供一个在Firefox中find的JS引擎的分析器。

就像已经有一些用户指出的那样:这对于小string是无关紧要的。

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

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

和…一样快

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

用克努特的话来说,“不成熟的优化是万恶之源!” 无论哪种方式的小偏差最终都不会有太大的影响; 我会select更可读的。

更容易阅读的方法在查看代码时可以节省人类可察觉的时间,而“快速”方法仅在人们浏览页面时浪费不可察觉且可忽略的时间量。

我知道这个post是蹩脚的,但我不小心发布了一些完全不同的思想,这是一个不同的线程,我不知道如何删除post。 我的错…

使用jspref.com设置一个快速的基准testing并检查Javascript性能变化是相当容易的。 当这个问题被问到的时候,可能没有。 但是,对于这个问题的磕磕绊绊,他们应该到现场。

我在http://jsperf.com/string-concat-methods-test上做了各种连接方法的快速testing。;

我喜欢用function性的风格,比如:

 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") ] ) ) 

这种风格看起来可读性和透明性 它导致创造公用事业,减less代码的重复。

这也倾向于自动使用中间string。

据我所知,每个级联都意味着内存重新分配。 所以这个问题不是运营商用来做的,解决的办法是减less连接数。 例如,可以的话,在迭代结构之外进行连接。

是的,根据通常的基准。 EG: http : //mckoss.com/jscript/SpeedTrial.htm 。

但对于小string,这是不相关的。 你只会关心非常大的string的表演。 更重要的是,在大多数JS脚本中,瓶颈很less在string操作上,因为没有足够的。

你最好看DOM的操作。