添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

提示:理解长任务
浏览器执行耗时操作超过50ms就是长任务

JavaScript 单线程

同步任务:同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务:异步任务指的是,不进入主线程,而进入任务队列的任务,只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

  1. 所有的同步任务都在主线程上执行,形成了一个执行栈。
  2. 主线程外,还存在一个“任务队列”。只要异步任务有了运行结果,就在“任务队列”中放置一个事件
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件,哪些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
  4. 主线程不断重复上面的第三步、这个过程就是事件循环

异步任务又分为宏任务、微任务

懒得写-------

出现长任务的原因:

例如: 要执行一个运算量很大的函数,他要加载一个 loading,页面中也不会立刻出现 loading 动画,出现动画的时候是运算函数执行完毕之后。

解决方案:

  1. 通过 Web Worker 开辟一个新线程,在 Web Worker 中执行耗时操作 需要请点击最详情
  2. 时间切片,将耗时操作分批次处理 需要请点击查看最详情

Web Worker:

核心思想:可以将一些耗时的数据处理操作从主线程中剥离,使主线程更加专注于页面渲染和交互 Worker 线程和主线程都通过 postMessage() 方法发送消息,通过 onmessage 事件接收消息。在这个过程中数据并不是被共享的,而是被复制的
  • 懒加载
  • 处理页面有计算密集型的任务
  • 文本分析
  • 流媒体数据处理
  • canvas 图形绘制
  • 图像处理
需要注意的点
  • 有同源限制
  • 无法访问 DOM 节点
  • 运行在另一个上下文中,无法使用Window对象
  • Web Worker 的运行不会影响主线程,但与主线程交互时仍受到主线程单线程的瓶颈制约。换言之,如果 Worker 线程频繁与主线程进行交互,主线程由于需要处理交互,仍有可能使页面发生阻塞
  • 共享线程可以被多个浏览上下文(Browsing context)调用,但所有这些浏览上下文必须同源(相同的协议,主机和端口号)
《从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池》 《从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术》 《从根上理解高性能、高并发(三):深入操作系统,彻底理解I/O多路复用》 《从根上理解高性能、高并发(四):深入操作系统,彻底理解同步与异步》 《从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程》(* 本文) 《从根上理解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的》 作为即时通讯技术的开发者来说,高性能、高 参考文章“嵌入式应用软件 任务 划分的原则” 在基于实时操作系统(RTOS,RealTime Operating System)的单片机应用软件设计中,“ 任务 ”是一个很重要的概念。对于 任务 的划分,并没有一个人人都要遵守的规则,不同的人来设计一个同样规格要求的系统,会有不同的方案。本文将深入研究划分 任务 的方法,并在此基础上,从实用的角度给出编写基于RTX51 Tiny实时... 由于 FID 需要一个真实用户的交互,所以无法用实验数据测试。为了在实验数据下预测 FID,通常会用 TBT(Total Blocking Time),具体这个指标后面文章会介绍。他们测量的内容不同,但改善 TBT 通常也能改善 FID。一个糟糕的 FID 主要原因是JS执行过 ,优化JS的解析、编译、执行可以直接降低 FID。过 的JS执行当JS执行过程中,浏览器无法响应用户交互,因为主线程被占... let btn = document.getElementsByTagName('button') btn[0].addEventListener('click',function(){ arr = new Array(1000000) //程序执行时 任务 耗时监控(开始) SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startTime = new Date(); System.out.println("---整店库存校正(开始)" + " " + shopId + " " + calcuMonth + " " + df2.format(startTime) DECLAREjob_no_ NUMBER;BEGINDBMS_JOB.SUBMIT(job_no_,'proc_qszx_dw_sc(''040100'');', -- 一般会将 insert into 语句写到一个存储过程insert_Prod中sysdate,'TRUNC(sysdate)+1+2/24'); -- 2/24 每天凌晨2点COMMIT;END;... 与线程相比,Task是一个更高级的抽象概念,它代表了一个并发操作,而该操作并不一定依赖线程来完成。 Task是可以组合(compositional)的(你可以将它们通过延续(continuation)操作串联在一起)。它们可以使用线程池减少启动延迟,也可以通过TaskCompletionSource采用回调的方式避免多个线程同时等待I/O密集型操作。 Task类型也是C#异步功能的基础类型。 方面:加载优化、执行优化、渲染优化、样式优化、脚本优化 加载优化:减少HTTP请求、缓存资源、压缩代码、无阻塞、首屏加载、按需加载、预加载、压缩图像、减少Cookie、避免重定向、异步加载第三方资源 执行优化:CSS写在头部,JS写在尾部并异步、避免img、iframe等的src为空、尽量避免重置图像大小、图像尽量避免使用DataURL 渲染优化:设置viewport、减少 时间 分片技术解决 js 任务 导致的页面卡顿界面操作使用transform动画会使用GPU,不会让界面卡死 解决 js 任务 导致的页面卡顿 在 web 界面运行 时间 代码时,会造成界面卡死,最新看了一篇 时间 分片技术,实现了执行 时间 任务 而不会卡顿界面; 时间 分片技术(解决 js 任务 导致的页面卡顿) 此方法作用于多次循环的情况,如果是单次导致界面卡死情况,代码可以如下 //上面执行界面需要更新的 await new Promise((resolve)=> setTimeout(resolve