首页 > 其他分享 >【前端调试】- 借助Performance分析并优化性能

【前端调试】- 借助Performance分析并优化性能

时间:2023-01-08 14:12:24浏览次数:59  
标签:code const 前端 worker task Performance total 调试

欢迎阅读本系列其他文章
【前端调试】- 更好的调试方式 VSCode Debugger
【前端调试】- 断点调试的正确打开方式

介绍

首先简单过一下Performance的使用,打开网页点击控制台Performance,录制5s的数据

image

其中 Main 这部分就是网页的主线程,也就是执行 Event Loop 的部分:

image

灰色就代表宏任务 task(这里带了红色是因为在 Performance 中宽度代表时间,超过 50ms 就被认为是 Long Task,会被标红。)
橙色:浏览器内部的 JS
蓝色:html parse
紫色:reflow、repaint
绿色:渲染
宽度代表了执行的时间,超过 50ms 就被任务是长任务,需要优化。
长度代表了调用栈深度,一般特别长的都是有递归在。

性能分析

下面这段代码在Performance中会显示如下

  useEffect(() => {
    function a() {
      b();
    }
    function b() {
      let total = 0;
      for (let i = 0; i < 10 * 10000 * 10000; i++) {
        total += i;
      }
      console.log("b:", total);
    }

    a();
  });

点击可以跳转带代码位置,显示对应耗时

这段代码在Performance中显示可以看到b函数的运行导致了耗时太高了,因为渲染和 JS 执行都在主线程,在一个 Event Loop 中,会相互阻塞,如果 JS 有长时间执行的 Task,就会阻塞渲染,导致页面卡顿。所以,性能分析主要的目的是找到 long task,之后消除它。

性能优化

我们优化的目标是把两个 long task 中的耗时逻辑(循环累加)给去掉或者拆分成多个 task。

但明显我们这里的逻辑没啥好拆分的,它就是一个大循环。

那么能不能不放在主线程跑,放到其他线程跑呢?浏览器的 web worker 好像就是做耗时计算的性能优化的。
创建worker.js

// worker
const workercode = () => {
    const compute = (num) => {
        let total = 0;
        for (let i = 0; i < num; i++) {
            total += i;
        }
        return total
    }
    this.onmessage = function (e) {
        const reslut = compute(e.data)
        this.postMessage(reslut);
    }
};

let code = workercode.toString();
code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));

const blob = new Blob([code], { type: "application/javascript" });
const worker_script = URL.createObjectURL(blob);

module.exports = worker_script;

需要使用的页面引入

import worker_script from "./worker";
  useEffect(() => {
    const myWorker = new Worker(worker_script);
    myWorker.postMessage(10 * 10000 * 10000);
    myWorker.onmessage = (m) => {
      console.log("msg from worker: ", m.data);
    };
  });

image
可以看到计算被转移到worker,虽然还是long task,但是不阻塞主线程,计算量也在那里没办法优化

这样,我们通过把计算量拆分到 worker 线程,充分利用了多核 cpu 的能力,解决了主线程的 long task 问题,界面交互会很流畅。

标签:code,const,前端,worker,task,Performance,total,调试
From: https://www.cnblogs.com/leise/p/17030932.html

相关文章

  • 解决flash builder 4.6调试不可用
    flashbuilder4.6在使用debug调试时需要系统安装相应浏览器对应的flashplayerdebug版本,flashplayerdebug到adobe官网下载最新的即可,下载地址为:​​http://www.adobe.com/......
  • CS:APP--Chapter05 : optimizing program performance (part 1)
    标签(空格分隔):CS:APPprologueTheprimativeobjectofaprogrammerismakeitruncorrectlyevenfast.Notonlydoweensureotherscanmakesenseofit,buta......
  • 前端三个实用小妙招分享给大家
    前言整理下本人在工作中撸代码遇到的一些刚看时一脸懵,实则很简单就能解决的小妙招,希望对大家有所帮助~伪元素动态改变其样式我们都用过伪元素,什么::before,::after啊这些等......
  • 2023/1/4 记录最近的单片机调试
    1同一单元的UART时钟最好用不同的时钟(指UART1与UART0,UART2由于是1单元因此目前看来不产生影响)。2GPS发送消息过多如果接收长度没有填好会导致填满内存最终死机。3......
  • 基于vue+Element Table封装(纯前端解决方案,附源码)
    (文章目录)前言这个项目是拿来练手的项目,基于VUE+ElementUI,并没有做后端,所以用的是纯前端的解决方案(有更好的办法欢迎提出),主要实现的是对列表数据的查询,筛选,修改这些常......
  • OpenOCD + DAP-LINK 调试ESP32的失败经历(2)
    背景https://www.cnblogs.com/liteng0305/p/17018299.html上次使用乐鑫编译好的OpenOCD失败,可能是因为没有开启CMSIS-DAP支持,手动开启编译试一下平台UbuntuLinux5.4.......
  • 前端
    前端1HTTP超文本传输协议以及HTML2CSS层叠样式表3CSS浮动布局、溢出、定位及JavaScript基本数据类型4js的基本数据类型、流程控制以及BOM和DOM操作5js获取用户操......
  • 大前端html学习05-表格和表单
    一、表格的作用及基本语法1、数据表格的作用及组成td></td></tr></table>注:一个tr表示一行;一个td表示一列(一个单元格)行分组<thead></thead>表头<tbody></tbody>......
  • Apipost——让前端、后端、测试共用同一份API文档
    作为软件开发从业者,API调试是必不可少的一项技能,在这方面Postman做的非常出色。但是在整个软件开发过程中,API调试只是其中的一部分,还有很多事情Postman无法完成,比如:AP......
  • 前端浅谈 - js的垃圾回收
    1.对于js来说什么是垃圾?    垃圾就是没用了的东西.emmm~~对于js来说,这种说法不是特别准确但是又特别贴切.占着内存但是又不被需要的变量被称为垃圾(有被内涵到).......