都说在javascript中,用下面的方式处理字符串的连接会存在效率问题,var str = "hello";
str += "world";因为这种操作非常消耗资源.如果重复这一过程几百次,甚至几千次,就会造成性能问题。很多地方也建议使用下面的方式处理,效果会更好。function StringBuffer() {   
    this.__strings__ = new Array;   
}   
  
StringBuffer.prototype.append = function (str) {   
    this.__strings__.push(str);   
}   
  
StringBuffer.prototype.toString = function() {   
    return this.__strings__.join("");   
}同时还有下面的测试代码:var d1 = new Date();     
var str = "";     
for (var i=0; i < 10000; i++) {   
    str += "text";   
}     
var d2 = new Date();   
document.write("<br/>concatenation:  " + (d2.getTime() - d1.getTime()) + " milliseconds" ); 
  
StringBuffer对象实现:   
  
var oBuffer = new StringBuffer();     
d1 = new Date();     
for (var i=0; i < 10000; i++){   
    oBuffer.append("text");   
}     
var sResult = oBuffer.toString();     
d2 = new Date();   
//输出两者所用的时间差   
document.write("<br/>concatenation with StringBuffer:  " + (d2.getTime() - d1.getTime()) + " milliseconds" ); ------------------------------------------------------------------------------------------------------------------
测试结果(由于测试电脑性能较差,所以时间也较长)
IE 6.0 
第一次加载页面显示结果
concatenation: 844 milliseconds
concatenation with StringBuffer: 218 milliseconds多次刷新后
concatenation: 500 milliseconds
concatenation with StringBuffer: 219 millisecondsGoogle Chrome 3.0
第一次加载页面显示结果
concatenation: 3 milliseconds
concatenation with StringBuffer: 16 milliseconds多次刷新后
concatenation: 2 milliseconds
concatenation with StringBuffer: 5 milliseconds
----------------------------------------------------------------------------------------------------------正如上所示,使用了StringBuffer对于ie来说,性能确实提升不少,但是对于google浏览器来说,却得到相反的结果。而一个普遍认同的观点是,google浏览器比ie速度快。那么上面的结果如何解释呢?如果我们要在字符串的连接这一问题上写出浏览器兼容性良好的js代码,又该如何处理?希望大家讨论。回家过年,散分,也提前祝大家新年快乐

解决方案 »

  1.   

    google 浏览器采用的是多进程,每个标签为一个进程,彼此之间互不影响。一个标签崩溃了,不会影响到其他标签的浏览。
      

  2.   

    这个得分析Chrome的内核代码了。如果上千次字符串拼接,那么必然要用buffer5毫秒和2毫秒,用户感觉不到。
      

  3.   

    那是因为这里只是循环10000次,如果再多加几个0,时间差的绝对值会更大。另外,刚刚发现有人之前已经做了同样的事情。
    http://www.joymood.cn/posts/2009/09/300.html
      

  4.   

    对于大字符串的拼接,多数情况下应该是StringBuffer对象好
      

  5.   

    这要看不同的内核对于+=操作的实现方式了,大量的拼接还是用buffer比较好,这点比较同意楼上几位朋友的意见。
      

  6.   

    第一次看到JS还用StringBuffer
    我倒是经常用数组:
    var arr = new Array();   
    d1 = new Date();   
    for (var i=0; i < 10000; i++){ 
        arr.push("text"); 
    }   
    var sResult = arr.join('');
    d2 = new Date(); 
    //输出两者所用的时间差 
    document.write(" <br/>concatenation with StringBuffer:  " + (d2.getTime() - d1.getTime()) + " milliseconds" ); 
      

  7.   

    var d1 = new Date();   
    var str = "";   
    for (var i=0; i < 30000; i++) { 
        str += i; 
    }   
    var d2 = new Date(); 
    document.write(" <br/>concatenation:  " + (d2.getTime() - d1.getTime()) + " milliseconds" );
     
    StringBuffer对象实现: 
     
    var oBuffer = new StringBuffer();   
    d1 = new Date();   
    for (var i=0; i < 30000; i++){ 
        oBuffer.append(i); 
    }   
    var k1 = new Date();
    var sResult = oBuffer.toString()
    var k2 = new Date();;   
    d2 = new Date(); 
    //输出两者所用的时间差 
    document.write(" <br/>concatenation with join:  " + (k2.getTime() - k1.getTime()) + " milliseconds" );
    document.write(" <br/>concatenation with StringBuffer:  " + (d2.getTime() - d1.getTime()) + " milliseconds" ); 观察下JOIN的时间  不过多个浏览器测试证明IE执行JS是慢了点
      

  8.   

    js和Java一样 只是JS里少了很多JAVA中的函数和类而已,所以要自己去写。
      

  9.   

    jf jf jf  嘿嘿嘿嘿 
      

  10.   

    这个还是有一定意义的,大量字符串拼接的需求一般都存在于需要一次生成大量HTML(比如表格)的时候。