`
purpen
  • 浏览: 785688 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>
分享到:
评论
1 楼 weiqingfei 2007-08-01  
用IE测试了以下,使用这个StringBuffer对象,和不使用,直接用Array,时间居然差一半。

相关推荐

    javascript 字符串连接的性能问题(多浏览器)

    今天看了javascript 高级程序设计谈到了字符串连接的性能问题

    再论Javascript下字符串连接的性能

    1.2 使用数组 在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案。 ...

    你必须知道的JavaScript 中字符串连接的性能的一些问题

    每种程序语言中都会涉及到字符窜连接,而这个小小的字符窜连接问题很可能会影响到系统的整体性能,本文主要探讨JavaScript中字符串连接的性能问题

    JavaScript 字符串连接性能优化

    每拼接一次字符串就循环重复2)~6),如果重复成百上千次则会非常消耗资源,影响性能。 解决方法: 使用 Array 对象存储字符串,之后使用 join()方法输出结果。 仿照 Java 中的 StringBuffer 类。

    Javascript三种字符串连接方式及性能比较

    主要介绍了Javascript三种字符串连接方式及性能比较,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    温故知新——JavaScript中的字符串连接问题最全总结(推荐)

    主要介绍了JS中的字符串连接问题,ECMAScript 中最常见的一个问题是字符串连接的性能。在调用 join() 方法时才会发生连接操作,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。

    lzutf8.js:高性能Javascript字符串压缩库

    使用低端台式机和1MB字符串进行的近似测量:3-14MB / s压缩,20-120MB / s解压缩(详细基准以及与其他Javascript库的比较可以在找到)。 由于专注于时间效率,因此与LZW +熵编码等尺寸更高效的算法相比,压缩率会...

    javascript下高性能字符串连接StringBuffer类

    使用StringBuffer类比使用加号节省50%左右的时间,大家对于大数据的连接最好使用这个方法。

    JavaScript 学习笔记(七)字符串的连接

    字符串的连接 一、 最常用+... 每次完成字符串连接都会执行步骤2到6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。所有以后就要摒弃这种用法了,哈哈哈。^_^ 二、 join()方法 代

    字符串拼接-不同方式下的性能问题纠错1

    我结合下面译者的译注和上网查找得出的结论大概是这样的:对于IE/7,使用Aarry.join()连接大量字符串的效率确实优于使用+元素运算符,归根到底是由于IE

    JavaScript 学习笔记二 字符串拼接

    每次完成字符串连接都会执行步骤2到6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用Array对象存储字符串,然后用join()方法(参数是空字符串)创建最后的字符串...

    JavaScript经典实例

     第1章使用JavaScript字符串  1.0简介  1.1连接两个或多个字符串  1.2连接字符串和另一种数据类型  1.3条件比较字符串  1.4在字符串中查找子字符串  1.5从一个字符串提取子字符串  1.6检查一个存在的、非空...

    多行:JavaScript中的多行字符串

    多行 JavaScript中的多行字符串没有更多的字符串连接或数组联接! 尽可能使用ES2015 。前const str = '' +'&lt;!doctype html&gt;' +'&lt;html&gt;' +'&lt;body&gt;' +'&lt;h1&gt;:red_heart: unicorns&lt;/h1&gt;' +'&lt;/body&gt;...

Global site tag (gtag.js) - Google Analytics