`

javascript应用---实现StringBuffer(附性能测试)转贴

阅读更多
ECMAScript 的字符串是不可变的,传统的字符串连接性能特别差:

Js代码 
var str = "hello";   
str += "world";  

var str = "hello";
str += "world"; 

这段代码在幕后执行的步骤如下:

(1) 创建存储 "hello " 的字符串。

(2) 创建存储 "world " 的字符串。

(3) 创建存储连接结果的字符串。

(4) 把 str 的当前内容复制到结果中。

(5) 把 "world " 复制到结果中。

(6) 更新 str ,使它指向结果。

每次完成字符串连接都会执行步骤 2 到 6 ,使得这种操作非常消耗资源。



可以用 prototype 属性为任何已有的类定义新方法,就像处理自己的类一样

Js代码 
<script type="text/javascript">   
function StringBuffer(){   
    this.string = new Array; //创建Array对象存储字符串   
}   
  
StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组   
    this.string .push(str);   
}   
  
StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串   
    this.string.join("");   
}   
</script>  

<script type="text/javascript">
function StringBuffer(){
	this.string = new Array; //创建Array对象存储字符串
}

StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组
	this.string .push(str);
}

StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串
	this.string.join("");
}
</script> 

性能测试代码:

Js代码 
<SCRIPT LANGUAGE="JavaScript">   
  var date1 = new Date();   
  var str = "";   
  for(i = 0; i<10000; i++){   
    str += "nomad";   
  }   
  var date2 = new Date();   
  alert(date2.getTime() - date1.getTime());//getTime()日期的毫秒表示   
  
  date1 = new Date();   
  var strBuffer = new StringBuffer();   
  
  for(i = 0; i<10000;i++){   
    strBuffer.append("nomad");   
  }   
  var result = strBuffer.toString();   
  date2=new Date();   
  
  alert(date2.getTime()-date1.getTime());   
  </SCRIPT>  

<SCRIPT LANGUAGE="JavaScript">
  var date1 = new Date();
  var str = "";
  for(i = 0; i<10000; i++){
	str += "nomad";
  }
  var date2 = new Date();
  alert(date2.getTime() - date1.getTime());//getTime()日期的毫秒表示

  date1 = new Date();
  var strBuffer = new StringBuffer();

  for(i = 0; i<10000;i++){
	strBuffer.append("nomad");
  }
  var result = strBuffer.toString();
  date2=new Date();

  alert(date2.getTime()-date1.getTime());
  </SCRIPT> 奇怪的事情出现了:

IE下:输出282  和 79

FF下:输出15 和 63

截然相反!!!




原因是FF的JS引擎已经对字符串的拼接运算“+”做了特别优化

分享到:
评论

相关推荐

    java基础--4.常用类-3.StringBuffer、StringBuilder

    - 无锁机制:与`StringBuffer`不同,`StringBuilder`没有进行线程同步,因此在单线程环境下,它的性能优于`StringBuffer`,因为它避免了线程同步带来的开销。 - 使用场景:在单线程环境中,为了提高字符串操作的...

    Java编程语言中字符串相关类及其应用详解 - String、StringBuilder与StringBuffer

    最后对比了 StringBuilder 与 StringBuffer 在性能和线程安全性方面的区别。 适合人群:有一定编程经验、正在学习 Java 或已经熟悉 Java 编程但希望深入了解字符串处理细节的技术人员。 使用场景及目标:适用于初学...

    StringBuffer

    ### Java中的`StringBuffer`详解 #### 引言 在Java编程语言中,`StringBuffer`是一个关键的数据结构,尤其适用于需要频繁修改字符串...掌握`StringBuffer`的使用,对于提高程序的性能和代码的健壮性具有重要意义。

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

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

    在JavaScript中实现StringBuffer类是一个提升性能的有效方法,特别适合于需要频繁进行大量字符串连接的场景。据描述所示,使用StringBuffer类相比于使用加号连接字符串,在执行效率上可以节省大约50%的时间。这意味...

    Java软件开发实战 Java基础与案例开发详解 9-2 StringBuffer和String Builder类共9页.pdf

    ### Java软件开发实战:StringBuffer和StringBuilder类 #### 1. 概述 在Java编程中,处理字符串是一项常见的需求。对于需要频繁修改的字符串,使用`String`类可能会导致性能问题,因为每次修改都会创建一个新的`...

    String,StringBuffer,StringBuilder区别

    关于字符串操作对性能的影响,实际的性能测试显示,在JVM(Java虚拟机)的优化和垃圾回收机制的帮助下,字符串操作的性能影响被大大降低。在某些情况下,甚至可以通过JVM编译器的优化,将字符串拼接等操作优化为一个...

    JavaScript实现Java中StringBuffer的方法

    以下是JavaScript中模拟`StringBuffer`的实现: ```javascript function StringBuffer() { this.__strings__ = []; } StringBuffer.prototype.append = function(str) { this.__strings__.push(str); }; ...

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    Java中StringBuffer对象的初始化.pdf

    在处理大量字符串连接操作时,使用`StringBuffer`而非`+`运算符连接`String`可以显著提高性能。`StringBuffer`的`append()`方法在内部使用了高效的缓冲机制,避免了每次连接时创建新的`String`对象。 **6. 其他方法...

    String&Stringbuffer

    通过上述示例可以看出,`StringBuffer`不仅能够有效地处理字符串的分割和提取,还能方便地进行字符串内容的修改和插入,适用于需要频繁操作字符串的应用场景。 #### 六、结论 综上所述,`String`和`StringBuffer`...

    StringBuffer类的总结

    2. **线程安全**:`StringBuffer` 在实现上采用了同步机制(synchronized),确保了多线程环境下的安全性。这使得在多个线程同时访问 `StringBuffer` 对象时不会出现数据不一致的问题。 3. **高效性**:对于需要...

    StringBuffer和String_区别

    ### StringBuffer与String的区别详解 #### 一、概念与特性 **String** 是 Java 中一个不可...通过以上对比分析,我们可以看出,在不同的应用场景下,选择合适的字符串类型对于提高程序的性能和减少内存消耗非常重要。

    Java语言中StringBuffer的用法

    相较于`String`类,`StringBuffer`提供了线程安全的动态字符串构建,避免了频繁创建新对象带来的性能开销。本文将深入探讨`StringBuffer`的用法,包括其常用方法,并通过实例对比`StringBuffer`与`String`的区别。 ...

    String及StringBuffer和StringBuilder的区别

    StringBuilder 在大多数实现中比 StringBuffer 要快。 性能对比 在一般情况下,我们推荐使用 StringBuffer,特别是在字符串对象经常改变的情况下。但是,在某些特别情况下,String 对象的字符串拼接其实是被 JVM ...

    String和StringBuffer详细用法总结

    根据给定的信息,本文将对`String`与`StringBuffer`在Java中的使用进行详细的解析...通过以上的分析与讨论,我们可以更好地理解和掌握`String`与`StringBuffer`在实际开发中的应用技巧,从而写出更高效、更可靠的代码。

    StringBuffer---马克-to-win java视频

    StringBuffer 马克-to-win java视频 字符串的详细描述介绍

    String ,StringBuffer与StringBuilder

    String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

Global site tag (gtag.js) - Google Analytics