【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 millisecondsConcatenation with StringBuffer: 140 milliseconds
这是为什么呢?
回答:
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的用法,现在看意义已经不大了。
以上是 【Web前端问题】JavaScript中StringBuffer和'+'的性能比较问题 的全部内容, 来源链接: utcz.com/a/138348.html