javascript性能优化三 之代码优化

代码优化介绍

如何精准测试Javascript性能

  • 本质上就是采用大量的执行样本进行数学统计和分析
  • 使用基于Benchmark.js的https://jsperf.com/完成

Jsperf使用流程

  1. 使用GitHub账号登录
  2. 填写个人信息(非必须)
  3. 填写详细的测试用例信息(title、slug)
  4. 填写准备代码(DOM操作时经常使用)
  5. 填写必要有setup与teardown代码
  6. 填写测试代码片段

Setup当前的一个前置准备工作,teardown是所有执行代码执行后要做的销毁的动作
javascript性能优化三 之代码优化
慎用全局变量

为什么要慎用?

  • 全局变量定义在全局执行上下文,是所有作用域链的顶端
  • 全局执行上下文一直存在于上下文执行栈,直到程序退出
  • 如果某个局部作用域出现了同名变量则会遮蔽或污染全局

第一种采用全局变量,第二种采用局部变量,然后用jsperf来比较一下两者的差异
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
结果可以看出全局的效果还是非常差的。

缓存全局变量
在程序执行过程中,有些地方的全局变量是不可避免的,可以将使用中无法避免的全局变量缓存到局部,比如当我们查找dom元素的时候,必须使用到document,但是document不是我们后面去定义的,是内置好了去使用的,这种情况下可以把大量需要重复使用的变量放置某个局部变量中,从而达到缓存的效果。
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
这里放没有js的html代码
javascript性能优化三 之代码优化
结果可以看出,缓存过的代码稍微有点优势。

通过原型对象添加附加方法
在原型对象上新增实例对象需要的方法,把对象放在构造函数的内部和原型链上的对比
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
差别还是比较大的。。。以后还是尽量在原型链上增加方法吧。

避开闭包陷阱
javascript性能优化三 之代码优化
关于闭包

  • 闭包是一种强大的语法
  • 闭包使用不当很容易出现内存泄漏
  • 不要为了闭包而闭包
    javascript性能优化三 之代码优化
    如果btn元素不存在了,但是el有一个引用关系,所以垃圾垃圾回收机制也不会回收
    javascript性能优化三 之代码优化
    在下面把el置为null,可以释放这个dom的引用

避免属性访问方法使用

JavaScript中的面向对象

  • JS不需属性的访问方法,所有属性都是外部可见的
  • 使用属性访问方法只会增加一层重定义,没有访问的控制力
    javascript性能优化三 之代码优化
    对比这两段代码,一个有属性的访问函数,一个直接使用对象中的属性
    javascript性能优化三 之代码优化
    javascript性能优化三 之代码优化
    差距还是比较大的。。。下次不要提供访问方法了,直接用吧。。。

For循环优化
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
相差不多,但是当达到一定量的时候还是有差距的,可以选择length先获取到。

选择最优的循环方法
javascript性能优化三 之代码优化
猜猜哪个效率高。。。
javascript性能优化三 之代码优化
Foreach效率最高。其次for

节点添加优化
节点的添加操作必然会有回流和重绘
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
通过数值可以看出,文档碎片要快一点的。

克隆优化节点操作
javascript性能优化三 之代码优化
javascript性能优化三 之代码优化
差不多吧,用克隆来优化节点的操作稍微快一丢丢吧。。。

直接量替换Object操作
javascript性能优化三 之代码优化