再论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 相关文章推荐
用jquery.sortElements实现table排序
May 04 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
详解JavaScript的策略模式编程
Jun 24 Javascript
使用vue.js制作分页组件
Jun 27 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
js中作用域的实例解析
Mar 16 Javascript
js编写选项卡效果
May 23 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
javascript浏览器用户代理检测脚本实现方法
Oct 27 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
angular-tree-component的使用详解
Jul 30 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/02 无线电
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
php中return的用法实例分析
2015/02/28 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python实现应用程序在右键菜单中添加打开方式功能
2017/01/09 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Django开发中的日志输出的方法
2018/07/02 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
pandas 空数据处理方法详解
2019/11/02 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
如何在pycharm中安装第三方包
2020/10/27 Python
英国女士家居服网站:hush
2017/08/09 全球购物
小学生勤俭节约演讲稿
2014/08/28 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
倡议书的格式写法
2015/04/28 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android