JavaScript 字串拼接效能分析小記

來源:互聯網
上載者:User

JavaScript 中,我們經常會因為各種各樣的原因去拼接字串,可能是為了Html的呈現,可能是為了屬性的設定,也可能僅僅是為了輸出調試日誌。

  每次拼接字串的時候,我們很自然地去考慮它的效能,是不是str=str+a是不是和str+=a效能一樣,使用數組Join是不是會更快一些,哪一種才是最好的實現。

的確,我們有諸多方式去拼接字串,下面本文將會將主流字串拼接方逐一進行效能評測。

公平起見,我們的測試都是跑在各瀏覽器的最後一個正式發布版本上,即IE9 ,Chrome19,FF13 及Opera12。

為了測試,我們先構造一個 data,它有個成員,是個100大小的數組。

   1: var length = 100; 

   2: var data = { list: [] }; 

   3: for (var i = 0; i < length; i ++) { 

   4:     data.list.push({ 

   5:         str1: 'chsword, 鄒健, Zou Jian ', 

   6:         str2: 'http://chsword.cnblogs.com', 

   7:         str3: 'http://www.chsword.net', 

   8:         str4: '"http://weibo.com/chsword","http://t.qq.com/chsword"', 

   9:         str5: 'test' 

  10:     }); 

  11: }; 

準備好了,那麼我們來進行測試,我選定了8種字串拼接的方法,然後每一種運行1W次的字串拼接,每一次拼接將元素的五個子項目拼接在一起:

1.str+=str+a;
2.str=str.concat(a);

3.arr.push(a); and arr.join(“”);

4.str=str.concat(a,b,c,d,e);

5.str=str+a;

6.str=String.prototype.concat(str,a,b,c,d,e);

7.str=String.prototype.concat.apply(s, [a,b,c,d,e]);

8.str=String.prototype.concat(str,a);
9.arr[arr.length]=a

我將以上測試回合在這些瀏覽器上: IE 9, Chrome 19, Firefox 13, Opera 12.

結果為:

註:圖表中單位為MS,標記為2000的都是運行了1分鐘以上還未停止的。

通過圖表,我們可以看到+=的效能在主流瀏覽器中平均最高,不過,要說明一點,+=操作在IE早期版本中,效能較差。

Array.Join 來拼接字串,在FF和Chrome中都比+=方法慢上數倍。

另外,還有像String.prototype.concat(str,a,b,c,d,e)這樣的操作,如果在Chrome及Opera中大量執行的話,會直接令頁面掛掉,所以這些都是不推薦使用的

總結一下,總體看來+=的效能最高,早先的瀏覽器中,使用Array.Join效能會較高

測試代碼 :

1.使用 += 

   1: var str=""; 

   2: for (var i = 0; i < number; i ++) { 

   3:     for(var j=0;j<length;j++){ 

   4:         str+=data.list[j].str1; 

   5:         str+=data.list[j].str2;

   6:         str+=data.list[j].str3;

   7:         str+=data.list[j].str4;

   8:         str+=data.list[j].str5;

   9:     } 

  10:     str+="\n"; 

  11: } 

2.str.concat

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str=str.concat(data.list[j].str1); 

   5:         str=str.concat(data.list[j].str2); 

   6:         str=str.concat(data.list[j].str3); 

   7:         str=str.concat(data.list[j].str4); 

   8:         str=str.concat(data.list[j].str5); 

   9:     } 

  10:     str=str.concat( "\n"); 

  11: } 

3.Use Array Join  

   1: var arr=[]; 

   2: for (var i = 0; i < number; i ++) { 

   3:     for(var j=0;j<length;j++){ 

   4:         arr.push(data.list[j].str1); 

   5:         arr.push(data.list[j].str2); 

   6:         arr.push(data.list[j].str3); 

   7:         arr.push(data.list[j].str4); 

   8:         arr.push(data.list[j].str5); 

   9:     } 

  10:     arr.push("\n"); 

  11: } 

  12: arr.join(""); 

4.str=str.concat(a,b,c,d,e);  

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str = str.concat(data.list[j].str1 

   5:         ,data.list[j].str2 

   6:         ,data.list[j].str3 

   7:         ,data.list[j].str4 

   8:         ,data.list[j].str5); 

   9:     } 

  10:     str = str.concat("\n"); 

  11: } 

5.str=str+a

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str = str + data.list[j].str1; 

   5:         str = str + data.list[j].str2; 

   6:         str = str + data.list[j].str3; 

   7:         str = str + data.list[j].str4; 

   8:         str = str + data.list[j].str5; 

   9:     } 

  10:     str = str + "\n"; 

  11: } 

6.str=String.prototype.concat(str,a,b,c,d,e)

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str = String.prototype.concat(str,data.list[j].str1, 

   5:         data.list[j].str2, 

   6:         data.list[j].str3, 

   7:         data.list[j].str4, 

   8:         data.list[j].str5); 

   9:     } 

  10:     str = String.prototype.concat(str,"\n"); 

  11: } 

7.str=String.prototype.concat.apply(s, [a,b,c,d,e])

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str = String.prototype.concat.apply(str, [data.list[j].str1, 

   5:         data.list[j].str2, 

   6:         data.list[j].str3, 

   7:         data.list[j].str4, 

   8:         data.list[j].str5]); 

   9:     } 

  10:     str =String.prototype.concat.apply(str,["\n"]); 

  11: } 

8.str=String.prototype.concat(str,a)

   1: var str = ""; 

   2: for (var i = 0; i < number; i++) { 

   3:     for (var j = 0; j < length; j++) { 

   4:         str = String.prototype.concat.call(str,data.list[j].str1); 

   5:         str = String.prototype.concat.call(str,data.list[j].str2); 

   6:         str = String.prototype.concat.call(str,data.list[j].str3); 

   7:         str = String.prototype.concat.call(str, data.list[j].str4); 

   8:         str = String.prototype.concat.call(str,data.list[j].str5); 

   9:     } 

  10:     str = String.prototype.concat(str, "\n"); 

  11: } 

9.arr[arr.length]

 1 var arr=[]; 2             for (var i = 0; i < number; i ++) {             3                 for(var j=0;j<length;j++){ 4                     arr[arr.length]=data.list[j].str1; 5                     arr[arr.length]=data.list[j].str2; 6                     arr[arr.length]=data.list[j].str3; 7                     arr[arr.length]=data.list[j].str4; 8                     arr[arr.length]=data.list[j].str5; 9                 }10                 arr[arr.length]="\n";11             }12             arr.join("");

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.