來源:happyshow.org
在做大字符串連接時,常用 += 來連接字符串,但這種連接符的效率隨著字符串的增大迅速降低,比如下面輸出1000個5行5列的表格:
<script>
var d1 = new Date();
var str = "";
for (i=0; i<1000; i++){
str += "<table width="300" border="1" cellpadding="5" cellspacing="1"> <tr> <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr><tr><td>11</td><td>22</td>
<td>33</td><td>44</td><td>55</td></tr><tr><td>111</td><td>222</td><td>333</td>
<td>444</td><td>555</td></tr><tr><td>1111</td><td>2222</td><td>3333</td><td>4444</td>
<td>5555</td></tr><tr><td>11111</td><td>22222</td><td>33333</td><td>44444</td>
<td>55555</td></tr></table>"
}
document.write(str)
var d2 = new Date();
alert(d2-d1);
</script>
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("<table width="300" border="1" cellpadding="5" cellspacing="1"> <tr> <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr><tr><td>11</td><td>22</td>
<td>33</td><td>44</td><td>55</td></tr><tr><td>111</td><td>222</td><td>333</td>
<td>444</td><td>555</td></tr><tr><td>1111</td><td>2222</td><td>3333</td><td>4444</td>
<td>5555</td></tr><tr><td>11111</td><td>22222</td><td>33333</td><td>44444</td>
<td>55555</td></tr></table>");
}

document.write(a.toString())

var d2 = new Date();
alert(d2-d1);
</script>
結果是耗時431毫秒,是+=連接方法效率的4~5倍。
在做大字符串連接時,常用 += 來連接字符串,但這種連接符的效率隨著字符串的增大迅速降低,比如下面輸出1000個5行5列的表格:














我的硬件配置使用 +=的連接辦法約需要1950毫秒。
在前面幾篇日志已經證明到,大字符串的連接最好使用數組,把每個子串放入數組元素,再執行join()連接起來,其效率比+=有明顯的提高。
因此,可以由此原理寫一個簡單的 StringBuffer 類,在遇到大字符串連接時可以派上用場。










代碼很簡單,再應用到上面的例子,看看執行時間要多少:


























結果是耗時431毫秒,是+=連接方法效率的4~5倍。