<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
ie 9/ JScript 9.0 (Chakra)
firefox/ spidermonkey
关于js引擎,见这篇文章:[资料] [链接帖] 各JavaScript引擎的简介,及相关资料/博客收集帖
根据上文的说法,js引擎中有共通的优化部分。比如,在js运行时系统中有这个部分: