【Web前端问题】JavaScript中StringBuffer和'+'的性能比较问题

<html>

<body>

<script type="text/javascript">

function StringBuffer () {

this._strings_ = new Array();

}

StringBuffer.prototype.append = function(str) {

this._strings_.push(str);

};

StringBuffer.prototype.toString = function() {

return this._strings_.join("");

};

var d1 = new Date();

var str = "";

for (var i=0; i < 1000000; i++) {

str += "text";

}

var d2 = new Date();

document.write("Concatenation with plus: "

+ (d2.getTime() - d1.getTime()) + " milliseconds");

var buffer = new StringBuffer();

d1 = new Date();

for (var i=0; i < 1000000; i++) {

buffer.append("text");

}

var result = buffer.toString();

d2 = new Date();

document.write("<br />Concatenation with StringBuffer: "

+ (d2.getTime() - d1.getTime()) + " milliseconds");

</script>

</body>

</html>

这段代码是W3C里的(重复次数稍作了修改),本来是用来演示StringBuffer在字符串连接时相比'+'的性能优势,但是结果很奇怪,有的时候'+'比StringBuffer性能还好些:

Concatenation with plus: 94 milliseconds

Concatenation with StringBuffer: 140 milliseconds

这是为什么呢?

回答:

js执行性能是js引擎相关的。抛去js引擎的上下文,而谈及某种做法的效率,没有太大意义。

测试步骤就是楼主的代码,但是把document.write改为了console.log(火狐不支持前者),为了让每次测试上下文没有相互影响,我都是在上一个测试结束之后,新开一个标签页进行的测试。以下是我在三个环境里面各十次的测试结果。

chrome/ v8

plus1185119712191165116611721196123311731169
string buffer1031108910151088111210831101109111071089

ie 9/ JScript 9.0 (Chakra)

plus1725205218641504151317861814150918221533
string buffer1487149915231716127715731590151515341553

firefox/ spidermonkey

plus484468467467471507467485470491
string buffer1230122612201217122412221222130813001243


关于js引擎,见这篇文章:[资料] [链接帖] 各JavaScript引擎的简介,及相关资料/博客收集帖

根据上文的说法,js引擎中有共通的优化部分。比如,在js运行时系统中有这个部分:

cons-string 或者叫 rope 来优化字符串拼接

回答:

我自己写了一个在 Node.js 里跑的,结果是 join 更快:

当然我已经试过了所有可能和题主不一样的地方,比如用双引号,比如用 new Date() 而不是 console.time()。。。

回答:

js的引擎对字符串连接这种常用的操作,一般都会做优化,所以测试结果差异不明显,一般情况下开发人员就不要太关心这方面的性能。

PS: java中的字符串操作也做了类似的优化,所以以前经验推荐使用的StringBuilder或者SringBuffer的用法,现在看意义已经不大了。

以上是 【Web前端问题】JavaScript中StringBuffer和&#x27;+&#x27;的性能比较问题 的全部内容, 来源链接: utcz.com/a/138348.html

回到顶部