再論Javascript下字符串連接的性能
1 如何進(jìn)行字符串連接?
首先讓我們來回顧一下字符串連接的兩種常用方法:
1.1 使用字符串連接運(yùn)算符
常用的語(yǔ)言(如Java、C#、PHP等)都有字符串連接運(yùn)算符,Javascript也不例外,代碼示例:
var str = "";
str = str + "a";
1.2 使用數(shù)組
在常用的語(yǔ)言中,字符串連接運(yùn)算的性能普遍不高,為此在C#中就專門提供了StringBuilder(Java中提供了StringBuffer)用于連接字符串。而在Javascript中就出現(xiàn)了通過Array模擬StringBuilder的方案。
var str = [];
for (var i = 0; i < 100; i++) {
str[i] = "12345";
}
str = str.join("");
2 測(cè)試
下面通過復(fù)制字符串的過程來測(cè)試兩種方法的性能:
2.1 通過字符串連接運(yùn)算符進(jìn)行復(fù)制:
function copyByOperator(str, times) {
var newStr = "";
for (var i = 0; i < times; i++) {
newStr += str;
}
return newStr;
}
2.2 通過數(shù)組進(jìn)行復(fù)制:
function copyByArray(str, times) {
var newStr = [];
for (var i = 0; i < times; i++) {
newStr[i] = str;
}
return newStr.join("");
}
str采用一段固定的HTML字符串,長(zhǎng)度是61。
2.3 IE下的測(cè)試
考慮到IE的性能比較差,先用小的times值(6000)在IE 6、IE 7和IE 8下面測(cè)試。運(yùn)行10次后取平均值,結(jié)果如下:
瀏覽器 | copyByOperator | copyByArray |
---|---|---|
IE 6 | 1780.4ms | 9.5ms |
IE 7 | 1754.6ms | 7.7ms |
IE 8 | 1.6ms | 9.4ms |
IE6、7與IE8的測(cè)試結(jié)果相距甚遠(yuǎn),很明顯地,IE 8對(duì)字符串連接運(yùn)算進(jìn)行了優(yōu)化,效率已經(jīng)高于數(shù)組復(fù)制法。
2.4 各種瀏覽器下的測(cè)試
下面再用比較大的times值(50000)對(duì)最新版本的各種瀏覽器進(jìn)行測(cè)試。
瀏覽器 | copyByOperator | copyByArray |
---|---|---|
IE 8 | 21.8ms | 54.7ms |
Firefox 3.6 | 40.9ms | 27.9ms |
Chrome 4 | 4.4ms | 10.9ms |
Safari 4.0.5 | 41.6ms | 34.6ms |
Opera 10.50 | 33.1ms | 23ms |
這個(gè)結(jié)果真是出人意料。IE 8下的字符串連接運(yùn)算竟然把Chrome以外的瀏覽器都打敗了,那些老說IE性能低下的可要注意點(diǎn)了。而在Chrome下也出現(xiàn)了字符串連接運(yùn)算比數(shù)組復(fù)制法高效的情況。
3 總結(jié)
瀏覽器的性能在不斷地提高,作為前端工程師,也要適時(shí)調(diào)整Javascript程序的優(yōu)化策略,以獲得最佳的性能。
相關(guān)文章
通過javascript實(shí)現(xiàn)段落的收縮與展開
這篇文章主要介紹了通過javascript實(shí)現(xiàn)段落的收縮與展開,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06深入理解JavaScript繼承的多種方式和優(yōu)缺點(diǎn)
這篇文章主要介紹了深入理解JavaScript繼承的多種方式和優(yōu)缺點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05js Math數(shù)學(xué)簡(jiǎn)單使用操作示例
這篇文章主要介紹了js Math數(shù)學(xué)簡(jiǎn)單使用,結(jié)合實(shí)例形式分析了js Math數(shù)學(xué)相關(guān)函數(shù)的基本用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03IScroll那些事_當(dāng)內(nèi)容不足時(shí)下拉刷新的解決方法
下面小編就為大家?guī)硪黄狪Scroll那些事_當(dāng)內(nèi)容不足時(shí)下拉刷新的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07JavaScript中的boolean布爾值使用學(xué)習(xí)及相關(guān)技巧講解
JavaScript中的boolean布爾值使用學(xué)習(xí)及相關(guān)技巧講解,特別是Boolean的用法以及適用!!將truthy或falsy值轉(zhuǎn)換為布爾值的用法非常巧妙,需要的朋友可以參考下2016-05-05淺談javascript中的instanceof和typeof
這篇文章主要簡(jiǎn)單介紹了javascript中的instanceof和typeof的相關(guān)資料,需要的朋友可以參考下2015-02-02JavaScript設(shè)計(jì)模式策略模式案例分享
這篇文章主要介紹了JavaScript設(shè)計(jì)模式策略模式案例分享,策略設(shè)計(jì)模式就是指一個(gè)問題匹配多個(gè)解決方法,不一定要用到哪一個(gè),而且有可能隨時(shí)增加多個(gè)方案2022-06-06