在做大字符串连接时,常用 += 来连接字符串,但这种连接符的效率随着字符串的增大迅速降低,比如下面输出1000个5行5列的表格:
<script>
var d1 = new Date();
var str = "";
for (i=0; i<1000; i++){
str += ""300" border="1" cellpadding="5" cellspacing="1"> 1 | 2 | 3 | 4 | 5 |
11 | 22 |
33 | 44 | 55 |
111 | 222 | 333 |
444 | 555 |
1111 | 2222 | 3333 | 4444 |
5555 |
11111 | 22222 | 33333 | 44444 |
55555 |
"
}
document.write(str)
var d2 = new Date();
alert(d2-d1);
script>
我的硬件配置使用 +=的连接办法约需要1950毫秒。
在前面几篇日志已经证明到,大字符串的连接最好使用数组,把每个子串放入数组元素,再执行join()连接起来,其效率比+=有明显的提高。
因此,可以由此原理写一个简单的 StringBuffer 类,在遇到大字符串连接时可以派上用场。
function StringBuffer(){
this.data = [];
}
StringBuffer.prototype.append = function(){
this.data.push(arguments[0]);
return this;
}
StringBuffer.prototype.toString = function(){
return this.data.join("");
}
代码很简单,再应用到上面的例子,看看执行时间要多少:
<script>
function StringBuffer(){
this.data = [];
}
StringBuffer.prototype.append = function(){
this.data.push(arguments[0]);
}
StringBuffer.prototype.toString = function(){
return this.data.join("");
}
var d1 = new Date();
var a = new StringBuffer();
for (i=0; i<1000; i++){
a.append(""300" border="1" cellpadding="5" cellspacing="1"> 1 | 2 | 3 | 4 | 5 |
11 | 22 |
33 | 44 | 55 |
111 | 222 | 333 |
444 | 555 |
1111 | 2222 | 3333 | 4444 |
5555 |
11111 | 22222 | 33333 | 44444 |
55555 |
");
}
document.write(a.toString())
var d2 = new Date();
alert(d2-d1);
script>
结果是耗时431毫秒,是+=连接方法效率的4~5倍。
阅读(260) | 评论(0) | 转发(0) |