再论Javascript下字符串连接的性能


Posted in Javascript onMarch 05, 2011

1 如何进行字符串连接?

首先让我们来回顾一下字符串连接的两种常用方法:
1.1 使用字符串连接运算符

常用的语言(如Java、C#、PHP等)都有字符串连接运算符,Javascript也不例外,代码示例:

var str = ""; 
str = str + "a";

1.2 使用数组

在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案。

var str = []; 
for (var i = 0; i < 100; i++) { 
str[i] = "12345"; 
} 
str = str.join("");

2 测试

下面通过复制字符串的过程来测试两种方法的性能:
2.1 通过字符串连接运算符进行复制:
function copyByOperator(str, times) { 
var newStr = ""; 

for (var i = 0; i < times; i++) { 


newStr += str; 

} 

return newStr; 
}

2.2 通过数组进行复制:
function copyByArray(str, times) { 
var newStr = []; 

for (var i = 0; i < times; i++) { 


newStr[i] = str; 

} 

return newStr.join(""); 
}

str采用一段固定的HTML字符串,长度是61。
2.3 IE下的测试

考虑到IE的性能比较差,先用小的times值(6000)在IE 6、IE 7和IE 8下面测试。运行10次后取平均值,结果如下:
IE浏览器下的测试结果
浏览器 copyByOperator copyByArray
IE 6 1780.4ms 9.5ms
IE 7 1754.6ms 7.7ms
IE 8 1.6ms 9.4ms

IE6、7与IE8的测试结果相距甚远,很明显地,IE 8对字符串连接运算进行了优化,效率已经高于数组复制法

2.4 各种浏览器下的测试

下面再用比较大的times值(50000)对最新版本的各种浏览器进行测试。

各种浏览器的测试结果
浏览器 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

这个结果真是出人意料。IE 8下的字符串连接运算竟然把Chrome以外的浏览器都打败了,那些老说IE性能低下的可要注意点了。而在Chrome下也出现了字符串连接运算比数组复制法高效的情况。

3 总结

浏览器的性能在不断地提高,作为前端工程师,也要适时调整Javascript程序的优化策略,以获得最佳的性能。

Javascript 相关文章推荐
juqery 学习之五 文档处理 包裹、替换、删除、复制
Feb 11 Javascript
JSP跨iframe如何传递参数实现代码
Sep 21 Javascript
延时加载JavaScript代码提高速度
Dec 27 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
Jul 01 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
Node.js使用supervisor进行开发中调试的方法
Mar 26 Javascript
vue.js循环radio的实例
Nov 07 Javascript
使用vue重构资讯页面的实例代码解析
Nov 26 Javascript
再论Javascript的类继承
Mar 05 #Javascript
Array的push与unshift方法性能比较分析
Mar 05 #Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 #Javascript
判断用户是否在线的代码
Mar 05 #Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 #Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 #Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 #Javascript
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
python实现机器人行走效果
2018/01/29 Python
python如何统计序列中元素
2020/07/31 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
Django ORM filter() 的运用详解
2020/05/14 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
会计专业自荐信范文
2013/12/02 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS