`
tianqing52
  • 浏览: 43363 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

转载: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:  " +
  29.  (d2.getTime() - d1.getTime()) + " milliseconds" );   
  30.   

 经过上述测试结果应该说明使用StringBuffer类比使用加号可节省50%-66%的时间.(计算程序执行的时间差,

是衡量javascript性能最常用的方法).

 好了,大家可能对字符串连接有一种新的认识,其实,我们也可以看到使用对象编程的一个好处..^_^.

有什么理解有误或写法不准确的地方,希望高手留言或评论指正.

<javascript 高级程序设计=""></javascript>

以上是转载的,但是实际用例测试之后,并不是这样子的。
自己做了三个测试:
function addStr(){
var ts = new Date(); 
var str = ""; 
for(var i=0;i<10000;i++) 
str += "text" 
var te = new Date();
document.write("原始的方法加号 拼接10000个字符串 花费时间:"+(te.getTime()-ts.getTime())+"秒"); 
}

function  stringbufferStr(){
var oSB = new StringBuffer(); 
var sbts = new Date(); 
for(var i=0;i<10000;i++) 
oSB.append("text"); 
var sRst = oSB.toString(); 
var sbte = new Date(); 
document.write("<br/>StringBuffer 拼接10000个字符串 花费时间:"+(sbte.getTime()-sbts.getTime())+"秒"); 
}

function arryAddStr(){
var ayts = new Date(); 
var ayy=[];
var str = ""; 
for(var i=0;i<10000;i++) 
 ayy.push("text"); 
str = ayy.join(";");
var ayte = new Date();
document.write("<br/>ayy数组 push 拼接10000个字符串 花费时间:"+
(ayte.getTime()-ayts.getTime())+"秒"); 
}
addStr();
stringbufferStr();
arryAddStr();
chrome下的结果:
原始的方法加号 拼接10000个字符串 花费时间:1秒
StringBuffer 拼接10000个字符串 花费时间:6秒
ayy数组 push 拼接10000个字符串 花费时间:1秒  
IE8下的结果:不稳定
原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:16秒
ayy数组 push 拼接10000个字符串 花费时间:0秒
360下的结果:
原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:16秒
ayy数组 push 拼接10000个字符串 花费时间:15秒

   oP浏览器下的结果:

 

原始的方法加号 拼接10000个字符串 花费时间:1秒

StringBuffer 拼接10000个字符串 花费时间:2秒

ayy数组 push 拼接10000个字符串 花费时间:1秒

FF下的结果:

原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:1秒
ayy数组 push 拼接10000个字符串 花费时间:1秒 

 

如果把数量增加到十万,还是+最快啊

分享到:
评论

相关推荐

    JavaScript语言教程:JavaScript 字符串

    ### JavaScript字符串方法详解 #### 一、概述 在JavaScript中,字符串是一种常用的数据类型,用于表示文本信息。字符串可以通过多种方式进行操作,例如查找字符、连接字符串等。本篇教程将详细介绍JavaScript中的...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册九:字符串

    2. 连接字符串:可以使用`+`运算符或`concat()`方法连接字符串。 3. 字符串切割:`slice()`, `substring()`, `substr()`用于截取字符串,`split()`根据分隔符切割成数组。 4. 查找替换:`indexOf()`查找指定子串首次...

    JavaScript字符串函数大全

    根据提供的文件信息,这里将详细解释与JavaScript字符串相关的函数,并补充一些缺失或不清晰的部分,以便更好地理解每个函数的功能及用法。 ### JavaScript字符串函数大全 #### 1. Asc(x) - **功能**:返回字符的...

    javascript字符串操作

    ### JavaScript字符串操作详解 在JavaScript中,字符串是用于表示文本数据的一种基本数据类型。字符串可以包含单个字符或多个字符组合成的文本序列。本文将详细介绍JavaScript中的字符串操作方法,帮助开发者更好地...

    JavaScript:ES6新特性:模板字符串与解构赋值

    ### JavaScript:ES6新特性详解:模板字符串与解构赋值 #### 1. ES6简介与环境设置 ##### 1.1 ES6新特性概述 ES6,即ECMAScript 2015,是JavaScript语言的一个重要版本,自2015年发布以来,对JavaScript的发展...

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

    这里需要注意的是,最新版本的Firefox已经修复了字符串连接性能问题,而旧版本的Firefox(如1.0或之后的版本)可能比普通的字符串连接更慢。 根据这些实验结果,可以得出以下几点关于字符串连接性能的知识点: 1. ...

    分享小知识点JavaScript字符串函数大全

    从给定的文件标题“分享小知识点JavaScript字符串函数大全”以及描述“JavaScript字符串函数大全 JS自带函数”,我们可以归纳出一系列JavaScript中的字符串处理函数及其用法。以下是对这些知识点的详细阐述: ### 1...

    Javascript中字符串相关常用的使用方法总结

    - 在JavaScript中,可以使用`+`符号来连接字符串。 ```javascript var num = 1 + 2; // 数字相加 console.log(num); // 输出3 var msg = 'hello' + 'world'; // 字符串连接 console.log(msg); // 输出hello...

    关于js中连接字符串效率的测试例子!

    在内部,JavaScript会创建新的字符串对象来存储连接结果,因此这种方式对于少量字符串连接效率尚可,但随着字符串数量增加,性能会下降,因为每次连接都会产生新的字符串对象。 2. 使用`Array.prototype.join()`:...

    theredoc让多行JavaScript字符串看起来排版更好

    然而,JavaScript原生不支持多行字符串,我们通常使用反斜杠(\)来连接多行,但这会导致代码可读性降低,排版混乱。为了解决这个问题,出现了诸如`template literals`(模板字面量)的特性,但有时它们仍不能满足对...

    javascript字符串排序

    在JavaScript编程语言中,字符串排序是一项常见的操作,特别是在处理用户输入、数据分析或者构建动态内容时。标题"javascript字符串排序"提示我们关注的重点是如何在JS环境中有效地对字符串进行排序。描述中提到的...

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

    在探讨JavaScript编程中,字符串连接是常见操作之一,但其性能问题往往会被人忽视。由于JavaScript的核心规范ECMAScript中字符串的不可变性,即字符串一旦创建,其内容就不能被改变,这意味着每次字符串连接操作实际...

    测试JavaScript字符串处理性能的代码

    在JavaScript中处理字符串是一项常见的任务,它包括创建字符串、修改字符串、连接字符串等操作。字符串操作的性能对于那些对性能要求较高的应用场景至关重要。 #### 知识点2:性能测试方法 性能测试通常涉及到编写...

    连接 字符 串.rar

    - **Java**:在Java中,`+`运算符可以用于连接字符串,但频繁使用会导致性能问题,因为每次连接都会创建新的字符串对象。更高效的方案是使用`StringBuilder`或`StringBuffer`类。 - **JavaScript**:JavaScript的`...

    Go-stringish一组可链式字符串助手可减少操纵字符串的痛苦

    为了解决这个问题,开发者创建了"Go-stringish",一个可链式字符串处理库,旨在简化和优化字符串处理过程,减少代码中的复杂性和冗余。 `stringish`库的核心特性在于它的链式方法调用,这种模式常见于JavaScript等...

    javascript实现的字符串与十六进制表示字符串相互转换方法

    本文实例讲述了javascript实现的字符串与十六进制表示字符串相互转换方法。分享给大家供大家参考。具体如下: 之所以写这个,是因为发现SQL注入和XSS中经常利用十六进制表示的字符串,比如 SELECT CONCAT(0x68656c6...

    JavaScript中的字符串操作 .txt

    1. **字符串连接**:可以通过加号(`+`)来连接两个或多个字符串。例如: ```javascript var str1 = "Hello"; var str2 = "World"; var fullStr = str1 + ", " + str2; // 结果为 "Hello, World" ``` 2. **...

Global site tag (gtag.js) - Google Analytics