提升用户体验方案之Web Worker—Worker2

前面章节我们梳理了woker的相关理论。下面让我们结合具体代码看看使用worker带来的变化

如上,我们做一个输入框,输入大数字,计算从1到给定数值的总和,点击按钮开始计算,模拟一下复杂计算。

1、代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Worker演练</title>
</head>
<body>
  <!-- 输入 10000000000-->
  <div>计算从 1 到给定数值的总和</div>
  <div>
  <input type="text" placeholder="请输入数字" id="num1" />
  <button id="singleRef">主线程计算</button>
  <span>计算结果为:<span id="result1">-</span></span>
  </div>
  <div>
    <input type="text" placeholder="请输入数字" id="num2" />
    <button id="multipleRef">worker计算</button>
    <span>计算结果为:<span id="result2">-</span></span>        
  </div>
  <div>在计算期间你可以填XX表单</div>
  <input type="text" placeholder="请输入姓名" />
  <input type="text" placeholder="请输入年龄" />
  <script type="module" src="./multiple.js"></script>
  <script type="module" src="./single.js"></script>
</body>
</html>
js 复制代码
//主线程运算
//single.js
singleRef.onclick = () => {
  const num = parseInt(document.getElementById('num1').value)
  let result = 0
  console.log('%c 开始主线程测试 ', 'color:#fff; background:#00897b ')
  console.time('主线程执行时间')
  for (let i = 0; i <= num; i++) {
    result += i
  }
  // 由于是同步计算,在没计算完成之前下面的代码都无法执行
  console.timeEnd('主线程执行时间')
  document.getElementById('result1').innerHTML = result
}
js 复制代码
//multiple.js
//worker线程运算
multipleRef.onclick = () => {
  console.log('%c 开始Worker测试 ', 'color:#fff; background:#00897b ')
  const worker = new Worker('./worker.js')
  const num = parseInt(document.getElementById('num2').value);
  console.time('Worker执行时间')
   worker.postMessage(num)
   worker.onmessage = function (e) {
    document.getElementById('result2').innerHTML = e.data
    console.timeEnd('Worker执行时间')
  }
}
js 复制代码
//worker.js
function calc(num) {
  let result = 0
  // 计算求和(模拟复杂计算)
  for (let i = 0; i <= num; i++) {
    result += i
  }
  self.postMessage(result)
}

self.onmessage = function (e) {
  calc(e.data)
}

2、交互对比与性能分析

我们分析在输入框输入较大数字,比如,10000000000,打开控制台,让我们从交互体验和性能两方面看一下对比。

2.1、就页面交互来看

  • 主线程运算:

点击按钮,主线程处理一直在处理同步计算逻辑,在完成计算之前,会发现页面处于卡顿的状态,下方的两个输入框也无法点击交互,大约花了22s左右,结果渲染出来。但是这个卡顿时间给用户的体验就很差了。

  • worker运算:

点击按钮, Worker 运行独立于主线程的后台线程中,分担执行了大量占用CPU密集型的操作,解放了主线程,主线程就能及时响应用户操作而不会造成卡顿的现象。点完按钮后可以立即操作下面xx表单。大约20s左右,计算结果渲染出来。

tips:以上时间说明worker并不会让计算时间明显变短。

2.2、就线程使用来看

打开控制台的性能数据分析面板,开始录制

  • 主线程运算:

运行期间主线程打满

  • worker运算:

运行期间主线程比较空闲,开启了DedicatedWorker线程执行运算。

2.3、就CPU使用率来看

打开控制台性能监视器,可以观察代码运行时cpu的使用情况。

  • 主线程运算:

CPU使用率是100%

  • worker运算:

CPU使用率处于较低正常水平,计算过程跟没计算之前的水平一样。

3、简单运算使用worker

此时好奇宝宝就会问了,那么简单运算使用worker会是什么样呢,让我们试一下,输入10,看一下两者的运算时间。

可以看到使用worker 的执行时间明显大于不使用worker的执行时间多得多。这是为什么呢?

其实我们在上一章节也提到过,每次创建worker线程以及possmessage通信都是需要损耗一些性能以及时间的。因此web worker是不可以滥用 的哦,日常开发中,建议在需要消耗比较多的cpu运算能力的时候酌情使用。

相关推荐
小李小李不讲道理15 分钟前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻16 分钟前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front1 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰1 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼982 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮2 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20023 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员
excel3 小时前
🧩 深入浅出讲解:analyzeScriptBindings —— Vue 如何分析 <script> 里的变量绑定
前端
蓝瑟3 小时前
AI时代程序员如何高效提问与开发工作?
前端·ai编程
林晓lx3 小时前
使用Git钩子+ husky + lint语法检查提高前端项目代码质量
前端·git·gitlab·源代码管理