javascript
JavaScript中实现类似StringBuilder的功能
問題:字符串連接操作為何如此緩慢?
我們先來看下面這段代碼:
str?+=?'def';
在這段代碼背后系統做了如下工作:
????????1.為'abc'分配相應大小的內存區域并存入;
????????2.為'def'分配相應大小的內存區域并存入;
????????3.為'abcdef'分配相應大小的內存區域,并分別將'abc'及'def'從各自的內存區域復制到新的內存區域。
????????看出來沒有,問題的根源就在于存儲字符串的內存區域不能隨意的改變大小。這樣每次進行字符串連接時,必須首先為結果字符串分配存儲區域,然后再將各子串從各自的內存區域復制到新的內存區域,這樣的繁復操作無疑會帶來嚴重的性能問題。
基本思路
????????其實很簡單,就是利用Array的push()方法,將字符串中的所有子串放入一個Array中,最后通過join()方法得到最終字符串。
方法1-傳統方式(執行時間:172ms)
for?(var?i?=?0;?i?<?10000;?i++)?{
????str?+=?"abc";
}
方法2-Array方式(執行時間:62ms)
var?arr?=?new?Array();
for?(var?i?=?0;?i?<?10000;?i++)?{
????arr.push("abc");
}
str?=?arr.join('');
????????可以看出,第二種方法的代碼執行效率有了較大提高,仔細分析就會發現,方法2較之方法1,減少了內存分配步驟,因此性能得到了較大提升。
(注:代碼執行時間均來自筆者的測試環境,視具體情況可能會有所不同。)
完整代碼
1.定義StringBuilder類
function?StringBuilder()?{
????this._strings?=?new?Array();
}
//append方法定義
StringBuilder.prototype.append?=?function?(str)?{
????this._strings.push(str);
}
//toString方法定義
StringBuilder.prototype.toString?=?function?()?{
????return?this._strings.join('');
}
2.使用StringBuilder類
sb.append('abc');
sb.append('def');
alert(sb.toString());?//輸出'abcdef'
總結
????? 本文通過運用JavaScript中的面向對象功能模擬了.net中的StringBuilder,為了優化字符串連接性能,采用了Array方式進行操作。
轉載于:https://www.cnblogs.com/Kenny-Jiang/archive/2007/08/24/868778.html
總結
以上是生活随笔為你收集整理的JavaScript中实现类似StringBuilder的功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight教程第二部分:使用
- 下一篇: (转)JSP基础精华