利用webworker解决性能瓶颈案例

目录

  • js单线程的问题
  • webworker的基本使用
  • webworker的常见应用
    • 可视化优化
    • 导出Excel

js单线程的问题

众所周知,js不擅长计算,计算是同步的,大规模的计算会让js主线程阻塞,导致界面完成卡死。比如有一个600多亿次的计算,在js中至少得花个2、3s,这2、3s主线程是阻塞的,界面是完全卡死的。异步可以解决js的单线程问题,但是异步不是解决js单线程的终极方案,异步只是把任务发布出去等着,后面还是会拉到主线程执行,异步不可能在异步队列里自己执行,所以一个耗时很高的操作,无论你做不做异步,他都会卡死你的页面,比如一个2、3s的计算丢到异步队列中去,并不会在异步队列中自己算完了,始终要等着回到主线程再进行计算。
请添加图片描述
请添加图片描述
请添加图片描述

webworker的基本使用

在主线程中创建一个webworker,并向webworker指明要执行的内容(要执行的内容放在js文件里,将js文件传递给webworker),注意这个js文件必须是线上地址,那我们可以把js文件放在public文件夹中,因为服务跑起来后,public文件夹作为静态资源目录是可以直接在线上访问的:
请添加图片描述
webworker执行完list.js的内容后,通过self.postMessage()向主线程发送消息,主线程可以通过addEventListener("message",(e)=>{console.log(e.data})来获取webworker向主线程发送的数据(也可以通过onMessage获取),主进程可以使用postMessage()向webworker线程发送消息,webworker线程通过self.addEventListener("message",(e)=>{console.log(e.data})来获取
请添加图片描述
假如交给new Worker(在线js文件)的在线文件不止一个,是分了模块的,就需要在list.js中引入其他的js(如a.js),使用importScript("a.js")引入,注意a.js的地址也必须是网络地址,但他可以跨域,那就可以引入第三方库,可以挂别人的cdn
请添加图片描述
假如第三方模块使用es6的module规范写的,那么new Worker的时候需要说明:
请添加图片描述
此时,list.js引入a.js的时候可以使用import引入:
请添加图片描述
注意:

  1. webworker不能使用本地文件(即:new Worker(在线js文件)),必须是网络上的同源文件
  2. webworker不能使用window上的dom操作,也不能获取dom对象,dom相关的东西只有主线程有,只能做一些计算相关的操作。这就是vue、react没有使用webworker的原因,vue、react主要是针对dom节点做一些生成和计算,一些虚拟dom的比对可以交给webworker。
  3. 有的东西是无法通过主线程传递给子线程的,比如dom节点,一些对象里的特殊设置(freeze、getter、setter这些,所以vue的响应式对象是不能传递的),方法
  4. 模块的引入问题

webworker的常见应用

因为webworker的限制,就别想着多线程渲染dom了,因为他根本无法创建dom,所以vue和react没有考虑webworker,webworker主要应用于耗时的计算

  1. 随着webgl、canvas等能力的加入,web前端有越来越多的可视化操纵,比如在线滤镜,在线绘图,web游戏等,这些东西都是非常消耗计算的
  2. 一些后台管理系统也会涉及到一些,最常见的就是一些电子表单,比如10万条数据导出为Excel表格

可视化优化

实现图片加滤镜的效果:引入图片,通过drawImage将图片画到canvas上,然后点击过滤按钮,读取图片所有像素点(这张图片有160+w像素点,每个像素点有4个rgba值,那么就有600+w数据),对每个像素点循环100次进行加滤镜,合计60亿次计算。
请添加图片描述
请添加图片描述
点击页面过滤按钮后,主线程开始计算,页面没有反应,哪里都点不动,卡死,耗时800ms处理完成后页面才可以操作。如果将循环100次改为循环255次,则需要进行100+亿次计算,耗时2s多,页面卡死2s多。那我们可以把计算交给webworker,那么在webworker计算的时候,页面还能执行其他操作
请添加图片描述
请添加图片描述

导出Excel

往数组中push了10w个对象,点击导出按钮后,将10w条数据生成sheet表格并导出为一个excel对象。实际用户点击完导出按钮后,页面卡死,3、4s后Excel导出完毕,页面才能继续使用
请添加图片描述
使用webworker解决,这里使用了第三方xlsx库,我们可以找到xlsx的线上cdn地址传给new Worker,也可以从node_module中将xlsx库复制粘贴到public文件夹下,new Worker就引入这个地址,因为xlsx不是模块化的文件,所以excelworker使用import Script引入他
请添加图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502643.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构05】排序

系列文章目录 【数据结构05】排序 . 【算法思想04】二分查找 文章目录 系列文章目录[toc] 1. 基本思想与实现1.1 插入类排序1.1.1 直接插入排序(*)1.1.2 折半插入排序1.1.3 希尔排序(*) 1.2 交换类排序1.2.1 冒泡排序&#xff08…

数据挖掘——概论

数据挖掘——概论 数据、信息和知识的关联和联系数据挖掘数据挖掘定义数据挖掘的步骤数据挖掘的主要内容 数据、信息和知识的关联和联系 数据、信息和知识是知识工作者感知和认识客观事物的3个连贯的阶段。 数据无处不在,聚合/集成后转化为信息,结构化后…

Hello 2025

Hello 2025 A. MEX Table 题意: 给出 0 到 n ∗ m − 1 的数字,排列成 n m 的表格,最大化 ∑ i 1 n mex ⁡ ( { a i , 1 , a i , 2 , … , a i , m } ) ∑ j 1 m mex ⁡ ( { a 1 , j , a 2 , j , … , a n , j } ) 给出0到n*m-1的数字&…

[答疑]用例规约:系统请求3dsMax创建体块

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2024-12-22 12:39 潘老师,请教一个问题:在需求工作流书写系统用例规约时,这个“计算”(改变)可不可以写多个内容&…

第431场周赛:最长乘积等价子数组、计算字符串的镜像分数、收集连续 K 个袋子可以获得的最多硬币数量、不重叠区间的最大得分

Q1、最长乘积等价子数组 1、题目描述 给你一个由 正整数 组成的数组 nums。 如果一个数组 arr 满足 prod(arr) lcm(arr) * gcd(arr),则称其为 乘积等价数组 ,其中: prod(arr) 表示 arr 中所有元素的乘积。gcd(arr) 表示 arr 中所有元素的…

小程序租赁系统开发的优势与应用前景分析

内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin,未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案,云打包 需要排队且还有次数限制,本地打包 则就没有这些限制,而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化:一步直达聊天界面二、全新“项目”功能:让工作更有条理三、语音功能升级:全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 亲爱的用户&…

音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介

一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前,请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的,ISO/IEC是付费的,所以我们主要阅读ITU提供的官方文档,比如较新…

概述(讲讲python基本语法和第三方库)

我是北子,这是我自己写的python教程,主要是记录自己的学习成果方便自己日后复习, 我先学了C/C,所以这套教程中可能会将很多概念和C/C去对比,所以该教程大概不适合零基础的人。 it seems that python nowadays 只在人工…

Java jni调用nnom rnn-denoise 降噪

介绍&#xff1a;https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/README_CN.md 默认提供了一个wav的例子 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h>#include …

【软考网工笔记】计算机基础理论与安全——网络规划与设计

HFC 混合光纤同轴电缆网 HFC: Hybrid Fiber - Coaxial 的缩写&#xff0c;即混合光纤同轴电缆网。是一种经济实用的综合数字服务宽带网接入技术。 HFC 通常由光纤干线、同轴电缆支线和用户配线网络三部分组成&#xff0c;从有线电视台出来的节目信号先变成光信号在干线上传输…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件&#xff0c;新建文件或项目。如果要写一个GUI程序&#xff0c;应当选择Application&#x…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

数据仓库中的指标体系模型介绍

数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI&#xff08;关键绩效指标&#xff09;模型5. 主题域模型6.平衡计分卡&#xff08;BSC&#xff09;模型7.数据指标框架模…

2025元旦源码免费送

我们常常在当下感到时间慢&#xff0c;觉得未来遥远&#xff0c;但一旦回头看&#xff0c;时间已经悄然流逝。对于未来&#xff0c;尽管如此&#xff0c;也应该保持一种从容的态度&#xff0c;相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…

2025年Stable Diffusion安装教程(超详细)

StableDiffusion的安装部署其实并不困难&#xff0c;只需简单点击几下&#xff0c;几分钟就能安装好&#xff0c;不管是windows还是苹果mac电脑&#xff0c;关于StableDiffusion的各种安装方式&#xff0c;这片文章一一来给大家讲明白。&#xff08;所有安装资料都给大家整理好…

【openwrt】OpenWrt 路由器的 802.1X 动态 VLAN

参考链接 [OpenWrt Wiki] Wi-Fi /etc/config/wirelesshttps://openwrt.org/docs/guide-user/network/wifi/basic#wpa_enterprise_access_point 介绍 基于802.1X 无线网络身份验证࿰

Android12 App窗口创建流程

有关的窗口对象 PhoneWindowActivityThread#performLaunchActivity {Activity.attach}Surface new ViewRootImpl 创建null对象 mSurface.transferFrom(getOrCreateBLASTSurface())//填充内容 LayerSurfaceFlinger::createLayerSurfaceControlViewRootImpl#relayoutWindow{mSur…