javascript应用---实现StringBuffer(附性能测试)ECMAScript的字符串是不可变的,传统的字符串连接性能特别
javascript应用---实现StringBuffer(附性能测试)
ECMAScript的字符串是不可变的,传统的字符串连接性能特别差:
var str = "hello";str += "world";
?这段代码在幕后执行的步骤如下:
<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引擎已经对字符串的拼接运算“+”做了特别优化
?
StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串 this.string.join(""); }有问题哦StringBuffer.prototype.append = function(str){ //把参数str附加到字符串数组 this.string .push(str); } alert(new StringBuffer());StringBuffer.prototype.toString = function(){ //用join方法返回真正的字符串 this.string.join(""); }alert(new StringBuffer());
第一个弹出是对象,第二个是未定义
</script>
测试结果:
IE6:
数组连接方式用时:79
字符使用+号连接方式用时:5578
firefox3:
数组连接方式用时:12
字符使用+号连接方式用时:16
差距,挨。。。看来我也得升级IE了。 6 楼 biaowen 2008-06-21 不好意思,地一次帖代码,不记得用代码模式帖出来,呵呵,看起来有点乱。
