再论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 相关文章推荐
打开超链需要“确认”对话框的方法
Mar 08 Javascript
js获取class的所有元素
Mar 28 Javascript
浅析JQuery中的html(),text(),val()区别
Sep 01 Javascript
js实现两点之间画线的方法
May 12 Javascript
JS实现slide文字框缩放伸展效果代码
Nov 05 Javascript
基于JavaScript实现TAB标签效果
Jan 12 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 Javascript
浅谈React之状态(State)
Sep 19 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
Apr 23 Javascript
JS绘图Flot应用图形绘制异常解决方案
Oct 16 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP array_push 数组函数
2009/12/26 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
深入研究React中setState源码
2017/11/17 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
Python读写Json涉及到中文的处理方法
2016/09/12 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Django与JS交互的示例代码
2017/08/23 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
国际书籍零售商:Wordery
2017/11/01 全球购物
生产现场工艺工程师岗位职责
2013/11/28 职场文书
大学生个人事迹材料
2014/01/21 职场文书
仓库组长岗位职责
2014/01/29 职场文书
行政人事岗位职责
2014/03/17 职场文书
升国旗仪式主持词
2014/03/19 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
限期整改通知书
2015/04/22 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python