js三座大山之异步五基于异步的js性能优化

js三座大山

一:函数式编程
js三座大山之函数1
js三座大山之函数2-作用域与动态this

二:面向对象编程
js三座大山之对象,继承,类,原型链

三:异步编程:
js三座大山之异步一单线程,event loope,宏任务&微任务
js三座大山之异步二异步方案
js三座大山之异步三promise本质
js三座大山之异步四-Promise的同步调用消除异步的传染性
js三座大山之异步五基于异步的js性能优化

背景

js三座大山之异步一单线程,event loope,宏任务&微任务这篇文章中 我们留了一个问题,

通过异步api 例如定时器,http,promise,i/o等将其当做异步任务,等待异步事件完成 在触发回调将函数推入到任务队列中 等待主线程去执行。避免了异步任务阻塞后续代码执行,影响用户体验。如果任务本身依然比较重,那么执行依然会造成UI卡顿,导致页面无法响应,这个问题又该如何解决?

本文主要是利用异步编程+event loop来优化js的运行性能,解决上面的问题,避免页面卡顿。要解决这个问题首先我们需要了解一些浏览器渲染的基础知识。

浏览器的一帧:执行&渲染

渲染进程的主线程负责执行js和渲染UI,不断的将变化渲染为新的UI,浏览器每秒渲染60帧,如果低于这个频率就会失帧,页面不会发生变化,造成的现象就是卡了~。fps指每秒钟页面呈现的帧数,通常用于衡量页面的流畅程度。

  • 理想的渲染case1:fps=60左右 js&render都在一帧内完成 浏览器可以正确的读取变化的UI 页面非常流畅。

  • js异常的渲染case2:fps<60 因为js执行任务过重 导致执行时间过长 这时浏览器来渲染新的UI时 无法获取到最新的UI 所以不会重新渲染 屏幕还是上一次的UI 界面不发生变化 导致界面卡住了。

  • 渲染异常的case3:fps<60 出现这个情况大多数是因为同一时间渲染了大量的dom,因为render流程 执行时间过长 这时浏览器来渲染新的UI时 无法获取到最新的UI 所以不会重新渲染 屏幕还是上一次的UI 界面不发生变化 导致界面卡住了。我们可以采用分帧渲染的方式来优化这场景, 例如分帧组件。 vue-frame-render

  • 过渡回流重绘的case4: 代码中有对DOM的修改操作,并且紧接着有对样式的读取操作。例如,如果你先修改了元素的宽度,然后立即读取元素的宽度,浏览器为了获取正确的宽度值,会立即进行一次回流和重绘。

关于渲染方面的优化case3&case4 可以使用的手段有很多,这里不展开讨论 本文主要针对case2 做js运行时优化。

事件循环与一帧的关系

有很多同学会认为浏览器的一帧只会执行一次js渲染一次页面,实际上并不是这样。

在一帧的时间内,浏览器会尽可能地执行JavaScript代码并进行页面渲染。

但是,通常情况下,浏览器会在一帧的结束时进行一次页面渲染,而不是在执行每段JavaScript代码后都进行渲染。这是因为页面渲染(包括回流&重绘)是一个相对昂贵的操作,频繁地进行页面渲染会消耗大量的CPU和GPU资源,降低页面的性能。

优化js运行性能:主要针对上面的case2

  1. 通过将长任务拆分,然后分帧去执行任务。将case2转化为case1。
  2. 如果是一些计算性质的任务,可以通过webworker执行,避免阻塞主线程
  3. 利用浏览器空闲执行
  4. 为了避免js执行时间过长 可以通过主动让出主线的方式 避免长时间占用 造成卡顿。

封装的任务库。具体api可以看这里 js防卡顿指北:分帧,并行,空闲执行,延迟执行~

手机的高刷新与浏览器刷新率的关系

手机的刷新率和浏览器的刷新率是两个不同的概念,但它们都与屏幕的显示效果有关。

手机的刷新率,通常指的是屏幕硬件的刷新率,也就是屏幕每秒钟刷新图像的次数。一般来说,刷新率越高,屏幕显示的动画效果就越流畅。例如,一部180Hz刷新率的手机,意味着它的屏幕每秒钟可以刷新180次。

浏览器的刷新率,览器的刷新率,也被称为帧率,通常是由浏览器内核控制的, 指是每秒钟页面呈现的帧数,用于衡量页面的流畅程度

这两者的关系在于,如果手机的刷新率高于浏览器的刷新率,那么浏览器的动画效果可能无法充分利用手机屏幕的高刷新率。例如,即使手机的刷新率是180Hz,但如果浏览器的刷新率只有60Hz,那么在浏览器中播放的动画,每秒钟也只能刷新60次,而无法达到180次。

然而,需要注意的是,提高浏览器的刷新率并不一定能提高动画的流畅度,因为动画的流畅度还取决于JavaScript的运行速度、页面的复杂度等因素。此外,提高浏览器的刷新率可能会增加CPU和GPU的负载,导致电池电量更快地消耗。因此,在实际使用中,需要根据具体情况来权衡。

参考:

相关推荐
一个很帅的帅哥44 分钟前
axios(基于Promise的HTTP客户端) 与 `async` 和 `await` 结合使用
javascript·网络·网络协议·http·async·promise·await
dream_ready1 小时前
linux安装nginx+前端部署vue项目(实际测试react项目也可以)
前端·javascript·vue.js·nginx·react·html5
编写美好前程1 小时前
ruoyi-vue若依前端是如何防止接口重复请求
前端·javascript·vue.js
flytam1 小时前
ES5 在 Web 上的现状
前端·javascript
喵喵酱仔__1 小时前
阻止冒泡事件
前端·javascript·vue.js
GISer_Jing1 小时前
前端面试CSS常见题目
前端·css·面试
某公司摸鱼前端2 小时前
如何关闭前端Chrome的debugger反调试
javascript·chrome
八了个戒2 小时前
【TypeScript入坑】什么是TypeScript?
开发语言·前端·javascript·面试·typescript
不悔哥2 小时前
vue 案例使用
前端·javascript·vue.js
anyup_前端梦工厂3 小时前
Vuex 入门与实战
前端·javascript·vue.js