是+运算符性能比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性能分析
更多:
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的操作。