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

这是为什么呢?

阅读 11.3k
3 个回答

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

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

chrome/ v8

plus 1185 1197 1219 1165 1166 1172 1196 1233 1173 1169
string buffer 1031 1089 1015 1088 1112 1083 1101 1091 1107 1089

ie 9/ JScript 9.0 (Chakra)

plus 1725 2052 1864 1504 1513 1786 1814 1509 1822 1533
string buffer 1487 1499 1523 1716 1277 1573 1590 1515 1534 1553

firefox/ spidermonkey

plus 484 468 467 467 471 507 467 485 470 491
string buffer 1230 1226 1220 1217 1224 1222 1222 1308 1300 1243

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

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题