javascript字符串连接性能的问题

    今天看了javascript高级程序设计,其中注意到字符串连接性能问题的谈论.感觉以前自己写的程序只讲简单但是没有注意到性能问题.其中,在javascript中用的最多的字符串连接就有最大的问题.

    例如:
            var str = "hello";

           str += "world";

    大家可能使用最普遍的就是这种了,实际上,这段代码在幕后执行的步骤如下:
     1, 创建存储"hello"的字符串.
     2. 创建存储"world"的字符串.
     3.创建存储连接结果的字符串.
     4. 把str的当前内容复制到结果中.
     5.把"world"复制的结果中.
     6.更新str,使它指向结果.
     大家不难看出:每次完成字符串连接都会执行步骤2到6,使得这种操作非常消耗资源.如果重复这一过程几百次,甚至几千次,就会造成性能问题.所以,以后一定要注意,别做毫无意义的消耗...

     既然有问题,那就要解决.解决方法就是用Array对象存储字符串,然后用join()方法(参数是空字符串)创建最后的字符串.

    例如:
            var arr = new Array;
           arr[0] = "hello";
           arr[1] = "world";
           var str = arr.join("");
    这样,无论在数组中引入多少字符串都不成问题,因为只在调用join()方法时才会发生连接操作.执行的步骤:
    1. 创建存储结果的字符串.
    2. 把每个字符串复制到结果中的合适位置.
    当然,我们可以使它更容易理解一些,可以用StringBuffer类打包该功能:

  1. function StringBuffer() {   
  2.     this.__strings__ = new Array;   
  3. }   
  4.   
  5. StringBuffer.prototype.append = function (str) {   
  6.     this.__strings__.push(str);   
  7. }   
  8.   
  9. StringBuffer.prototype.toString = function() {   
  10.     return this.__strings__.join("");   
  11. }   
  12.   

  上述代码很容易理解,就不用多说,下面着重看一下,两种方法的性能比较.(用事实说话哟)^_^

下面代码测试StringBuffer对象和传统的字符串连接方法的性能比较:

  1. 传统方法:   
  2.   
  3. var d1 = new Date();   
  4.   
  5. var str = "";   
  6.   
  7. for (var i=0; i < 10000; i++) {   
  8.     str += "text";   
  9. }   
  10.   
  11. var d2 = new Date();   
  12.   
  13.   
  14. StringBuffer对象实现:   
  15.   
  16. var oBuffer = new StringBuffer();   
  17.   
  18. d1 = new Date();   
  19.   
  20. for (var i=0; i < 10000; i++){   
  21.     oBuffer.append("text");   
  22. }   
  23.   
  24. var sResult = oBuffer.toString();   
  25.   
  26. d2 = new Date();   
  27. //输出两者所用的时间差   
  28. document.write("<br/>concatenation with StringBuffer:  " + (d2.getTime() - d1.getTime()) + " milliseconds" );   
  29.   

 经过上述测试结果应该说明使用StringBuffer类比使用加号可节省50%-66%的时间.(计算程序执行的时间差,是衡量javascript性能最常用的方法).

 好了,大家可能对字符串连接有一种新的认识,其实,我们也可以看到使用对象编程的一个好处..^_^.有什么理解有误或写法不准确的地方,希望高手留言或评论指正.

<javascript 高级程序设计=""></javascript>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值