JS性能优化——JavaScript语言的优化

2020-11-11  本文已影响0人  yapingXu

拉勾大前端的学习笔记,仅作为学习记录

内容概要

内存管理

Js中的内存管理

// 申请
let obj = {}
// 使用
obj.name="lg"
// 释放
obj = null

Js中的垃圾回收

什么样的内容会被当做垃圾
因为js中内存管理是自动的,所以当对象不再被引用,对象不能从根上访问到,都是垃圾

可达对象
可以通过引用、作用于链访问到的对象就是可达对象
可达的标准是从根出发是否能够被找到
js中根就可以理解为是全局变量对象

垃圾回收
找到垃圾,让js的执行引擎来进行空间的释放和回收

js中的引用和可达

待补充

GC回收机制

GC的定义和作用

GC里面的垃圾是什么

function func(){
  name = 'lg'
  console.log(`${name} is a coder`)
}
func()
function func(){
  const name = 'lg'
  console.log(`${name} is a coder`)
}
func()

GC算法是什么

常见的GC算法

引用计数算法实现原理

核心思想:设置引用数,判断当前引用数是否为0
算法规则:当某个对象引用关系发生改变的时候,引用计数器会去修改这个对象所对应的引用数值,引用数字为0时立即回收
优点

缺点

function func(){
  const obj1 = {}
  const obj2 = {}

  obj1.name = obj2
  obj2.name = obj1  // 当垃圾回收obj1的时候会发现obj1被obj2所引用,obj1的引用计数不为0,所以GC引用计数算法下,obj1不能被回收
}
func()
标记清除算法的实现原理

核心思想:分标记和清除两个阶段

优点

缺点

标记整理算法实现原理

标记整理可以看做是标记清除的增强
标记阶段的操作和标记清除一致
清除阶段会先执行整理,移动对象位置
优点

缺点

认识V8

V8垃圾回收策略

V8中常用的GC算法

V8如何回收新生代对象

V8内存分配
新生代对象(64位32M | 32位16M) / 老生代的对象
新生代指的是存活时间较短的对象

新生代对象的回收实现

主要用复制算法+ 标记算法,将储存新生代对象的空间分为两个等大小的空间,使用空间叫做From ,空闲空间叫做To

老生代回收说明

老生代对象说明

回收实现
标记清除,标记整理,增量标记算法

步骤

  1. 首先标记清除
  2. 当想把新生代放入老生代的时候,并且当老生代空间不足的时候,触发标记整理
  3. 最后采用增量标记进行效率优化
细节对比

代码优化相关

function getBtn(){
  let btn1 = document.getElementById('btn1')
  let btn2 = document.getElementById('btn2')
}
function getBtn(){
  let doc = document
  let btn1 = doc.getElementById('btn1')
  let btn2 = doc.getElementById('btn2')
}
function F1(){
  this.foo = function (){
      console.log(111)
  }
}
f1 = new F1()

function F2(){}
F2.property.foo =  function (){
      console.log(111)
}
f2 = new F2()
function foo(){
  let el = document.getElementById('btn')
  el.onclick = function(){
    console.log(el.id)
  }
  el = null // 在函数内部删除对dom的引用,从而避免内存泄漏
}
foo()
function Person(){
  this.name = "coder"
  this.age = 18
  this.getAge = function (){
    return this.age
  }
}
const p1 = new Person()
const pAge = p1.getAge()

function Person(){
  this.name = "coder"
  this.age = 18
}
const p1 = new Person()
const pAge = p1.age
const btns = document.getElementByClass('.btn')
for(var i ; i< btns.length;i++){
  console.log(i)
}
for(var i ;len=btns.length; i< len;i++){
  console.log(i)
}
var arrList = [1,2,3,4,5]
// 最优
arrList.forEach(function(item){
  console.log(item)
})
// 第二
for(var i = arrList.length; i ;i--){
  console.log(arrList[i])
}
// 第三
for(var i in arrList){
  console.log(arrList[i])
}
for ( var i = 0; i<10; i++ ){
  var oP = document.createElement('p')
  oP.innerHTML = i
  document.body.appendChild(oP)
}

const fragEle = document.createElement('p')
for ( var i = 0; i<10; i++ ){
  var oP = document.createElement('p')
  oP.innerHTML = i
  fragEle.appendChild(oP)
}
document.body.appendChild(fragEle)
for ( var i = 0; i<3; i++ ){
  var oP = document.createElement('p')
  oP.innerHTML = i
  document.body.appendChild(oP)
}

var oldP = document.getElementById('box1')
for ( var i = 0; i<3; i++ ){
  var newP = oldP.cloneNode(false)
  newP.innerHTML = i
   document.body.appendChild(newP)
}
const a = new Array()
a[0] = 1
a[1] = 2
a[2] = 3

const a = [1,2,3]
上一篇下一篇

猜你喜欢

热点阅读