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

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

    博客分类:
  • js
阅读更多

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

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

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

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

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

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

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

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

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

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

 

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

<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 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引擎已经对字符串的拼接运算“+”做了特别优化

 

6
0
分享到:
评论
6 楼 biaowen 2008-06-21  
不好意思,地一次帖代码,不记得用代码模式帖出来,呵呵,看起来有点乱。
5 楼 biaowen 2008-06-21  
热闹热闹,我也做了测试,我用的是IE6和FF3,你的IE应该是新版本的吧,跟我差距很大。我把测试代码和结果帖出来。

<script language="javascript">
function StringBuffer() {
this._strings_= new Array;
}
StringBuffer.prototype.append = function(str) {
this._strings_.push(str);
};
StringBuffer.prototype.toString = function(mode) {
if(mode == null)
mode = "";
return this._strings_.join(mode);
};

var date1 = new Date();
var buffer = new StringBuffer();
for(i = 0; i < 10000; i++) {
buffer.append("biaowen");
}
var date2 = new Date();

var date3 = new Date();
var str = ""
for(i = 0; i < 10000; i++) {
str += "biaowen"
}
var date4 = new Date();

var d1 = date2.getTime() - date1.getTime();  //数组联系方式
var d2 = date4.getTime() - date3.getTime();  //加号连接符
document.write("数组连接方式用时:" + d1 + "<br>字符使用+号连接方式用时:" + d2);

</script>

测试结果:
IE6:
数组连接方式用时:79
字符使用+号连接方式用时:5578

firefox3:
数组连接方式用时:12
字符使用+号连接方式用时:16

差距,挨。。。看来我也得升级IE了。
4 楼 nomadyyj 2008-06-20  
不知道你要干什么?
3 楼 helloJ 2008-06-20  
StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组   
    this.string .push(str);   
}   

alert(new StringBuffer());

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

alert(new StringBuffer());


第一个弹出是对象,第二个是未定义
2 楼 nomadyyj 2008-06-20  
什么问题?
1 楼 helloJ 2008-06-20  
StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串   
    this.string.join("");   
} 


有问题哦

相关推荐

    JavaScript中String和StringBuffer的速度之争

    然而,如果项目中仍然需要支持较老的浏览器环境,并且性能测试表明自定义StringBuffer类能带来性能上的明显提升,那么采用这种优化手段也是值得考虑的。 需要注意的是,随着JavaScript引擎的不断升级优化,现代...

    java基础知识

    Java以其跨平台性(Write Once, Run Anywhere, WORA)、安全性、高性能等特点著称,在企业级应用、移动开发、Web应用等领域有着广泛的应用。 ### Java基础知识详解 #### 第1天~第5天:Java基础知识 1. **Java环境...

    JS提高优化性能完全秘籍.pdf

    ### JS提高优化性能完全秘籍 #### 执行效率优化技巧详解 **1.... **1.1 使用DocumentFragment优化多次append** ...通过采用这些技术,可以有效提高JavaScript代码的执行效率,从而提升前端应用的性能表现。

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

    因此,开发者在进行性能优化时,需要针对目标浏览器进行性能测试。 2. 在某些旧版浏览器中,如IE6,使用StringBuffer技术进行字符串连接可能会比使用加号(+)有更佳的性能表现,因为StringBuffer避免了在循环中频繁...

    RapidJson-2017.7.3

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读易写、机器解析和生成的特点,广泛应用于Web服务和分布式系统中的数据交换。RapidJson的设计目标是尽可能地减少内存分配和解析时间,从而在...

    2012年java面试题总结

    - **定义与功能**:Ajax(Asynchronous JavaScript and XML),即异步JavaScript和XML技术,是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不...

    阿里巴巴 面经

    - **JSON**:JavaScript Object Notation,广泛应用于Web应用。 - **XML**:Extensible Markup Language,用于文档交换。 - **Protocol Buffers**:Google开发的一种高效的二进制格式。 **43. 内存溢出与内存泄漏的...

    java最经典面试题.doc

    - **性能测试**:使用工具检测系统的性能瓶颈。 - **安全审计**:对系统进行安全扫描,防止安全漏洞。 #### 二十一、个人发展规划 - **短期目标**:提升专业技能,成为领域内的专家。 - **中期目标**:担任团队...

    各大公司面试

    - **持续集成/持续部署(CI/CD):** 自动化测试、构建和部署流程的实现。 ##### 3. Oracle数据库查询语言 **知识点:** - **SQL基础:** SELECT、INSERT、UPDATE、DELETE等基本操作。 - **复杂查询:** 子查询、联接...

    java面试总结

    - **应用场景**: 实现网页的部分刷新,提高用户体验。 #### 十三、JSP九大隐视对象中四个作用域的大小与作用范围 - **PageScope**: 页面范围内有效,页面销毁时消失。 - **RequestScope**: 请求范围内有效,请求...

    java培训课程体系

    - **测试与部署:** 进行单元测试和系统测试,并部署到服务器。 ##### 6.3 Ajax综合项目 - **Ajax技术:** 了解Ajax技术的基本原理及其优势。 - **项目实践:** 实现一个完整的Ajax项目,提高用户体验。 ##### 6.4...

    java面试知识

    - **应用场景**:提高读取性能,减轻数据库压力。 ##### 线程概述 - **线程状态**:新建、就绪、运行、阻塞、终止。 - **同步机制**:synchronized关键字、ReentrantLock等。 ##### Ajax请求Session超时问题 - *...

    java笔试程序分类总结

    } } } // 测试类 class Test { public static void main(String[] args) { SaleTicket ticket = new SaleTicket(); Thread t1 = new Thread(ticket, "窗口1"); Thread t2 = new Thread(ticket, "窗口2"); Thread t3...

    2021-2022计算机二级等级考试试题及答案No.16018.docx

    具体实现方式可能依赖于 JavaScript 代码,但由于题目中未给出具体的代码示例,因此无法进一步解析。 ### 6. Session 对象的有效期 - **题目**: Session 对象的默认有效期为多少分钟? - **选项**: - A. 10 - B....

    最新Java面试大全

    - **使用Ajax**:异步JavaScript和XML技术,实现局部刷新。 - **WebSocket**:实现全双工通信。 #### 23. 逻辑操作与条件操作的区别 - **逻辑操作**:如&、|,短路与非短路形式。 - **条件操作**:如&&、||,具有...

    自整理Java关于基础和框架的面试题

    - **StringBuilder**:可变字符串,非线程安全,性能优于`StringBuffer`。 ##### Hashtable与HashMap的区别 - **Hashtable**:线程安全,不允许null键和null值。 - **HashMap**:非线程安全,允许一个null键和多个...

    JAVA企业面试真题(框架部分)

    因此,在单线程环境下,StringBuilder比StringBuffer性能更高。 **应用场景分析**: - 如果需要处理不变的文本数据,则应选择String。 - 如果在多线程环境中对字符串进行修改操作,则选择StringBuffer。 - 如果...

    JAVA相关基础知识

    例如,计算阶乘的函数jc()展示了递归的基本应用,而字符串倒序可以通过StringBuffer或直接遍历字符数组实现。 7. **继承与组合**: 继承是“is-a”关系的体现,子类可以继承父类的属性和方法,易于代码复用。然而...

    软件编码规范

    - **String与StringBuffer**:在字符串频繁修改的情况下使用StringBuffer(或StringBuilder),以减少对象创建带来的性能开销。 - **集合**:根据集合的实际使用场景选择合适的集合类型。 - **对象**:尽量避免不必...

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

Global site tag (gtag.js) - Google Analytics