利用webworker解决性能瓶颈案例

news2025/1/7 16:47:34

目录

  • 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.coloradmin.cn/o/2272017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解卷积神经网络(CNN):图像识别的强大工具

1、引言 卷积神经网络(CNN)是一种深度学习模型,特别适合分析视觉数据。它们在处理图像和视频任务时表现尤为出色。由于CNN在物体识别方面的高效性,这种网络架构广泛应用于计算机视觉领域,例如图像分类、物体检测、面部…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…

VOC数据集格式转YOLO格式

将VOC格式的数据集转换为YOLO格式通常涉及以下几个步骤。YOLO格式的标注文件是每个图像对应一个.txt文件&#xff0c;文件中每一行表示一个目标&#xff0c;格式为&#xff1a; <class_id> <x_center> <y_center> <width> <height>其中&#xf…

win10搭建zephyr开发环境

搭建环境基于 zephyr官方文档 基于官方文档一步一步走很快就可以搞定 一、安装chocolatey 打开官网 https://community.chocolatey.org/courses/installation/installing?methodinstall-from-powershell-v3 1、用管理员身份打开PowerShell &#xff08;1&#xff09;执行 …

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

k8s集群监控系统部署方案

1.方案介绍 本文介绍一种k8s集群监控系统,该系统可以监控k8s集群中的pod和node的性能指标,以及K8s资源对象的使用情况。 监控流程: 集群资源数据采集(cadvisor、node-exporter、kube-state-metrics)-- 数据收集、存储、处理等(prometheus)-- 数据可视化查询和展示(gra…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…

WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法&#xff0c;它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。 写一个小demo演示一下 要求&#xff1a;在用户反馈界面点击建议或者评分按钮 弹出相应界面 编写MainWindow.xmal 主窗体 <Window x:C…

C语言 递归编程练习

1.将参数字符串中的字符反向排列&#xff0c;不是逆序打印。 要求&#xff1a;不能使用C函数库中的字符串操作函数。 比如&#xff1a; char arr[] "abcdef"; 逆序之后数组的内容变成&#xff1a;fedcba 1.非函数实现&#xff08;循环&#xff09; 2.用递归方法…

数据插入操作的深度分析:INSERT 语句使用及实践

title: 数据插入操作的深度分析:INSERT 语句使用及实践 date: 2025/1/5 updated: 2025/1/5 author: cmdragon excerpt: 在数据库管理系统中,数据插入(INSERT)操作是数据持久化的基础,也是应用程序与用户交互的核心功能之一。它不仅影响数据的完整性与一致性,还在数据建…

【Linux系列】使用 `nohup` 命令运行 Python 脚本并保存输出日志的详细解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)

Apple芯片 前言安装Homebrew安装uhd安装gnuradio使用b200mini安装好的路径下载固件后续启动频谱仪功能启动 gnu radio关于博主 前言 请参考本文进行安装&#xff0c;好多人买了Apple芯片的电脑&#xff0c;这种情况下&#xff0c;可以使用UHD吗&#xff1f;答案是肯定的&#…

多媒体素材库系统

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

即插即用,无痛增强模型生成美感!字节跳动提出VMix:细粒度美学控制,光影、色彩全搞定

文章链接&#xff1a;https://arxiv.org/pdf/2412.20800 代码地址&#xff1a;https://github.com/fenfenfenfan/VMix 项目地址&#xff1a;https://vmix-diffusion.github.io/VMix/ 亮点直击 分析并探索现有模型在光影、色彩等细粒度美学维度上生成图像的差异&#xff0c;提出…

I.MX6ull-PWM

一、PWM介绍 PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的 一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。 pwm的工作电路 它的四种时钟信号 (1)High-frequency referenc…

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…