再论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 相关文章推荐
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
解javascript 混淆加密收藏
Jan 16 Javascript
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
js获取浏览器的各种属性
Apr 27 Javascript
详解vue中组件参数
Jul 09 Javascript
记录一次开发微信网页分享的步骤
May 07 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
Aug 07 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
smarty中js的调用方法示例
2014/10/27 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
curl和libcurl的区别简介
2015/07/01 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
python处理xml文件的方法小结
2017/05/02 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
冬季安全检查方案
2014/05/23 职场文书
成本会计岗位职责
2015/02/03 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
pandas进行数据输入和输出的方法详解
2022/03/23 Python