JS下高效拼裝字符串的幾種方法比較與測(cè)試代碼
更新時(shí)間:2010年04月15日 00:02:49 作者:
本文介紹一下js如何高效來拼裝字符串的方法,希望大家看了以后多用效率高的代碼,不要讓客戶端瀏覽器執(zhí)行的太慢,提高用戶體驗(yàn)。
在使用Ajax提交信息時(shí),我可能常常需要拼裝一些比較大的字符串通過XmlHttp來完成POST提交。盡管提交這樣大的信息的做法看起來并不優(yōu)雅,但有時(shí)我們可能不得不面對(duì)這樣的需求。那么JavaScript中對(duì)字符串的累加速度如何呢?我們先來做下面的這個(gè)實(shí)驗(yàn)。累加一個(gè)長(zhǎng)度為30000的字符串。
測(cè)試代碼1 - 耗時(shí): 14.325秒
var str = "";
for (var i = 0; i < 50000; i++) {
str += "xxxxxx";
}
這段代碼耗時(shí)14.325秒,結(jié)果并不理想?,F(xiàn)在我們將代碼改為如下的形式:
測(cè)試代碼2 - 耗時(shí): 0.359秒
var str = "";
for (var i = 0; i < 100; i++) {
var sub = "";
for (var j = 0; j < 500; j++) {
sub += "xxxxxx";
}
str += sub;
}
這段代碼耗時(shí)0.359秒!同樣的結(jié)果,我們做的只是首先拼裝一些較小的字符串然后再組裝成更大的字符串。這種做法可以有效的在字符串拼裝的后期減小內(nèi)存復(fù)制的數(shù)據(jù)量。知道了這一原理之后我們還可以把上面的代碼進(jìn)一步拆散以后進(jìn)行測(cè)試。下面的代碼僅耗時(shí)0.140秒。
測(cè)試代碼3 - 耗時(shí): 0.140秒
var strArray = new Array();
for (var i = 0; i < 100; i++) {
var sub = "";
for (var j = 0; j < 500; j++) {
sub += "xxxxxx";
}
strArray.push(sub);
}
str = String.prototype.concat.apply("", strArray);
不過,上面這種做法也許并不是最好的!如果我們需要提交的信息是XML格式的(其實(shí)絕大多數(shù)情況下,我們都可以設(shè)法將要提交的信息組裝成XML格式),我們還能找能更高效更優(yōu)雅的方法—利用DOM對(duì)象為我們組裝字符串。下面這段代買組裝一個(gè)長(zhǎng)度為950015的字符串僅須耗時(shí)0.890秒。
利用DOM對(duì)象組裝信息 - 耗時(shí): 0.890秒
var xmlDoc;
if (browserType == BROWSER_IE) {
xmlDoc = new ActiveXObject("Msxml.DOMDocument");
}
else {
xmlDoc = document.createElement("DOM");
}
var root = xmlDoc.createElement("root");
for (var i = 0; i < 50000; i++) {
var node = xmlDoc.createElement("data");
if (browserType == BROWSER_IE) {
node.text = "xxxxxx";
}
else {
node.innerText = "xxxxxx";
}
root.appendChild(node);
}
xmlDoc.appendChild(root);
var str;
if (browserType == BROWSER_IE) {
str = xmlDoc.xml;
}
else {
str = xmlDoc.innerHTML;
}
測(cè)試代碼1 - 耗時(shí): 14.325秒
復(fù)制代碼 代碼如下:
var str = "";
for (var i = 0; i < 50000; i++) {
str += "xxxxxx";
}
這段代碼耗時(shí)14.325秒,結(jié)果并不理想?,F(xiàn)在我們將代碼改為如下的形式:
測(cè)試代碼2 - 耗時(shí): 0.359秒
復(fù)制代碼 代碼如下:
var str = "";
for (var i = 0; i < 100; i++) {
var sub = "";
for (var j = 0; j < 500; j++) {
sub += "xxxxxx";
}
str += sub;
}
這段代碼耗時(shí)0.359秒!同樣的結(jié)果,我們做的只是首先拼裝一些較小的字符串然后再組裝成更大的字符串。這種做法可以有效的在字符串拼裝的后期減小內(nèi)存復(fù)制的數(shù)據(jù)量。知道了這一原理之后我們還可以把上面的代碼進(jìn)一步拆散以后進(jìn)行測(cè)試。下面的代碼僅耗時(shí)0.140秒。
測(cè)試代碼3 - 耗時(shí): 0.140秒
復(fù)制代碼 代碼如下:
var strArray = new Array();
for (var i = 0; i < 100; i++) {
var sub = "";
for (var j = 0; j < 500; j++) {
sub += "xxxxxx";
}
strArray.push(sub);
}
str = String.prototype.concat.apply("", strArray);
不過,上面這種做法也許并不是最好的!如果我們需要提交的信息是XML格式的(其實(shí)絕大多數(shù)情況下,我們都可以設(shè)法將要提交的信息組裝成XML格式),我們還能找能更高效更優(yōu)雅的方法—利用DOM對(duì)象為我們組裝字符串。下面這段代買組裝一個(gè)長(zhǎng)度為950015的字符串僅須耗時(shí)0.890秒。
利用DOM對(duì)象組裝信息 - 耗時(shí): 0.890秒
復(fù)制代碼 代碼如下:
var xmlDoc;
if (browserType == BROWSER_IE) {
xmlDoc = new ActiveXObject("Msxml.DOMDocument");
}
else {
xmlDoc = document.createElement("DOM");
}
var root = xmlDoc.createElement("root");
for (var i = 0; i < 50000; i++) {
var node = xmlDoc.createElement("data");
if (browserType == BROWSER_IE) {
node.text = "xxxxxx";
}
else {
node.innerText = "xxxxxx";
}
root.appendChild(node);
}
xmlDoc.appendChild(root);
var str;
if (browserType == BROWSER_IE) {
str = xmlDoc.xml;
}
else {
str = xmlDoc.innerHTML;
}
相關(guān)文章
JavaScript 數(shù)據(jù)元素集合與數(shù)組的區(qū)別說明
我們?cè)讷@取一組頁面元素時(shí)常會(huì)用到getElementsByName()或是getElementsByTagName()方法。2010-05-05
基于JavaScript中標(biāo)識(shí)符的命名規(guī)則介紹
下面小編就為大家分享一篇基于JavaScript中標(biāo)識(shí)符的命名規(guī)則介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
javascript自執(zhí)行函數(shù)之偽命名空間封裝法
比較之后,我們可以發(fā)現(xiàn),第二方法更加的直觀,易于理解。但是少了封裝過程,代碼完全裸露在外。2010-12-12
實(shí)例講解javascript實(shí)現(xiàn)異步圖片上傳方法
給大家詳細(xì)講解一下如何通過javascript寫出異步圖片上傳,并且把實(shí)例代碼給大家分享了下,有興趣的讀者們測(cè)試一下吧。2017-12-12
js+canvas實(shí)現(xiàn)圖片格式webp/png/jpeg在線轉(zhuǎn)換
這篇文章主要介紹了js+canvas實(shí)現(xiàn)圖片格式webp/png/jpeg在線轉(zhuǎn)換,需要的朋友可以參考下2020-08-08
JavaScript 中的 `forEach` 無法退出循環(huán)的解決方案
在 JavaScript 中,forEach 是一個(gè)數(shù)組方法,它用來對(duì)數(shù)組中的每個(gè)元素執(zhí)行指定的回調(diào)函數(shù),為了更好地理解這個(gè)問題,本文將通過實(shí)際項(xiàng)目代碼示例,并結(jié)合詳細(xì)的目錄結(jié)構(gòu)來進(jìn)行講解,感興趣的朋友跟隨小編一起看看吧2024-12-12

