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 相关文章推荐
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
Jan 26 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
js判断手机系统是android还是ios
Mar 07 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
详解Vue2.0 事件派发与接收
Sep 05 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
Oct 25 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
微信小程序实现图片翻转效果的实例代码
Sep 20 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 Javascript
浅谈vue项目,访问路径#号的问题
Aug 14 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
php array_merge下进行数组合并的代码
2008/07/22 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
JavaScript插入动态样式实现代码
2012/02/22 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
python验证码识别的实例详解
2016/09/09 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
物流仓管员岗位职责
2013/12/04 职场文书
创业计划书六个要素
2013/12/26 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
局火灾防控工作方案
2014/05/25 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL