JS 字符串连接[性能比较]


Posted in Javascript onMay 10, 2009

一、ECMAScript的字符串是不可变的,即它们的值不能改变,因此当你写出下面的代码的时候发生了什么呢?
Js代码

var str = "Hello "; 
str += "world";

执行的步骤如下:
创建存储“Hello“的字符串
创建存储”world“的字符串
创建存储连接结果的字符串
把str的当前内容复制到结果中
把“world”复制到结果中
更新str,使它指向结果
每次完成字符串的连接都会执行步骤2-6,使得这种操作非常消耗资源。想象一下重复这个过程几百次,甚至几千次,那性能如何?
二、那么再看看下面的代码,来解决这种窘况
Js代码
var arr = new Array; 
arr[0] = "Hello "; 
arr[1] = "world"; 
var str = arr.join("");

执行的步骤如下:
创建存储结果的字符串
把每个字符串复制到结果中的适当位置
这样,无论数组要引入多少字符串都不成问题,因为只有在调用join()方法时候才会发生连接操作。
三、觉得操作很复杂?代码不能确切反应它的意图?那么我们用对象的解决方式吧,使它更容易理解,用StringBuffer类来封装该功能:
Js代码
function StringBuffer() { 
this._strs = new Array; 
} 
StringBuffer.prototype.append = function (str) { 
this._strs.push(str); 
}; 
StringBuffer.prototype.toString = function() { 
this._strs.join(""); 
};

好了,感受一下吧,现在如何操作字符串呢?
Js代码
var sb = new StringBuffer(); 
sb.append("Hello "); 
sb.append("world"); 
var result = sb.toString();

四、似乎色香味俱全了,但是吃下去的功效如何?
Js代码
var tStart = new Date(); 
var str = ""; 
for(var i=0;i<10000;i++) 
{ 
str += "text" 
} 
var tEnd = new Date(); 
document.write("原始的方法加号 拼接10000个字符串 花费时间:"+(tEnd.getTime()-tStart.getTime())+"秒"); 
var oSB = new StringBuffer(); 
tStart = new Date(); 
for(var i=0;i<10000;i++) 
{ 
oSB.append("text"); 
} 
var sRst = oSB.toString(); 
tEnd = new Date(); 
document.write("<br/>StringBuffer 拼接10000个字符串 花费时间:"+(tEnd.getTime()-tStart.getTime())+"秒");

可能你已经猜到了,StringBuffer要比+快,到底快多少呢?我的测试结果:
Js代码
FF3.0.10
原始的方法加号 拼接10000个字符串 花费时间:3豪秒
StringBuffer 拼接10000个字符串 花费时间:8豪秒
IE7
原始的方法加号 拼接10000个字符串 花费时间:15豪秒
StringBuffer 拼接10000个字符串 花费时间:16豪秒
IE8
原始的方法加号 拼接10000个字符串 花费时间:15豪秒
StringBuffer 拼接10000个字符串 花费时间:16豪秒
Chrome1.0.154.46
原始的方法加号 拼接10000个字符串 花费时间:1豪秒
StringBuffer 拼接10000个字符串 花费时间:2豪秒
五、怎么回事?
恩?眼睛花了?还是测试结果贴错了?还是……?
一切都没有错!
2006年11月此书出版《JavaScript高级程序设计》在84-85页,就是我上面的内容,我的测试结果却和它的完全相反,技术的变革还是……?
我觉得是一个教训!深刻的教训!不知道哪看了这篇文章的人会有何感想。
Javascript 相关文章推荐
Document对象内容集合(比较全)
Sep 06 Javascript
jQuery 图片切换插件(代码比较少)
May 07 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
Jun 11 Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 Javascript
js检测iframe是否加载完成的方法
Nov 26 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
jquery validation验证表单插件
Jan 07 Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 jQuery
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
在Vue项目中引入JQuery-ui插件的讲解
Jan 27 jQuery
小程序实现悬浮搜索框
Jul 12 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 Javascript
javascript获取当前ip的代码
May 10 #Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
May 10 #Javascript
extjs fckeditor集成代码
May 10 #Javascript
一组JS创建和操作表格的函数集合
May 07 #Javascript
给Function做的OOP扩展
May 07 #Javascript
js arguments.callee的应用代码
May 07 #Javascript
javascript 有用的脚本函数
May 07 #Javascript
You might like
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
php汉字转拼音的示例
2014/02/27 PHP
php格式化金额函数分享
2015/02/02 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
有关打架的检讨书
2014/01/25 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
企业宗旨标语
2014/06/10 职场文书
土地租赁意向书
2014/07/30 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
学校重阳节活动总结
2015/03/24 职场文书
告知书格式
2015/07/01 职场文书
教师师德工作总结2015
2015/07/22 职场文书
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python