hn-failte's blog hn-failte's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hn-failte

前端cv仔
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Webpack

  • React

  • JavaScript

    • new命令原理
    • ES5面向对象
    • ES6面向对象
    • 多种数组去重性能对比
    • JS随机打乱数组
    • 判断是否为移动端浏览器
    • 将一维数组按指定长度转为二维数组
    • 防抖与节流函数
    • JS获取和修改url参数
    • 比typeof运算符更准确的类型判断
    • 三级目录

    • JavaScript

      • JavaScript之函数尾调用与函数尾递归
      • 一种实现call、apply、bind的方法
      • 实现call、apply、bind
      • JavaScript闭包详解
      • 窗口间的通信与iframe跨域
      • JavaScript逻辑运算符“&&”和“||”短路原则的应用
      • Object原型梳理
      • JavaScript设计模式之发布&订阅模式
      • JavaScript核心:两链一包
      • JavaScript之正则
      • 字符串拼接性能优化
        • 传统String拼接
          • 字符串拼接过程
        • 解决方法
          • 数组解决方法
      • JavaScript变量转换
  • Vue

  • 混合开发

  • 学习笔记

  • 微信小程序

  • 前端
  • JavaScript
  • JavaScript
hn-failte
2019-01-09

字符串拼接性能优化

# 字符串拼接性能优化

在Java中,对大量字符串处理时存在StringBuilder、StringBuffer来进行优化,那么JavaScript的String是否也能进行优化呢?

这里以Java的StringBuffer为命名实现了一个JavaScript的StringBuffer。

# 传统String拼接

  • ECMAScript 的字符串的值 不能改变。

# 字符串拼接过程

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

以上代码的执行步骤如下:

  • 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("");
1
2
3
4

以上代码的执行步骤如下:

  • 1、创建数组
  • 2、将需要拼接的字符串加入数组
  • 3、调用join方法,创建存储结果的字符串,将数组中的元素全部拼接到字符串 使用该方法只在调用 join() 方法时才会发生连接操作。 缺陷:这段代码不能确切反映出它的意图。

# StringBuffer类打包

  • 为了解决传统方法存在的缺陷,可以将传统方法类打包为StringBuffer,专门解决拼接问题。
  • 该类存在两个方法,即 append() 和 toString() 方法。
function StringBuffer(str){
    var string = str ? [str] : [];
    if(!StringBuffer.prototype.append){
        StringBuffer.prototype.append=function(str){
            string.push(str);
        }
        StringBuffer.prototype.toString=function(){
            return string.join("");
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11

append() 是自定义方法,接收一个参数,并将该参数添加到内部数组中,toString()已经在继承Object原型存在,需要重写,该方法调用数组的join()方法,返回数组拼接后字符串。

使用demo:

var sb=new StringBuffer("failte");
console.log(sb);
console.log(sb.toString());
sb.append("'s");
console.log(sb.toString());
1
2
3
4
5

# 性能对比:

function StringBuffer(str){
    var string = str ? [str] : [];
    if(!StringBuffer.prototype.append) {
        StringBuffer.prototype.append = function (str) {
            string.push(str);
        }
        StringBuffer.prototype.toString = function () {
            return string.join("");
        }
    }
}

// 传统拼接
var str1 = "";
var d1 = Date.now(); // 时刻1
for(let i = 0; i<100000; i++){
    str1 += i;
}
var t1 = Date.now() - d1; // 时间间隔1

// StringBuffer拼接
var str2 = new StringBuffer("");
var d2 = Date.now(); // 时刻2
for(let i = 0; i<100000; i++){
    str2.append(i);
}
var t2 = Date.now()-d2; // 时间间隔2
console.log("t1: ", t1, "t2: ", t2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

测试结果: 使用两种方法测试拼接100000个字符串,三次结果如下:

  • Round 1: String拼接:26ms StringBuffer拼接:5ms
  • Round 2: String拼接:24ms StringBuffer拼接:5ms
  • Round 3: String拼接:28ms StringBuffer拼接:5ms

测试完成。通过比较,可以很明显的发现,StringBuffer拼接的速度比String拼接速度快5倍。

编辑 (opens new window)
#String
上次更新: 2021/08/05, 12:37:41
JavaScript之正则
JavaScript变量转换

← JavaScript之正则 JavaScript变量转换→

最近更新
01
基于 Taro 的微信小程序优化指南
02-16
02
搭建一个极简混合开发架构
08-03
03
使用State Hook
04-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 hn-failte | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式