性能优化问题思考总结

news2024/9/27 7:22:43

INP 是什么?

Interaction to Next Paint (INP)

INP是一项指标,通过观察用户在访问网页期间发生的所有点击、点按和键盘互动的延迟时间,评估网页对用户互动的总体响应情况。

互动是指在同一逻辑用户手势期间触发的一组事件处理脚本。例如,触摸屏设备上的“点按”互动包括多个事件,例如 pointerup、pointerdown 和 click。交互可由 JavaScript、CSS、内置浏览器控件(例如表单元素)或这些控件的组合促成。

互动的延迟时间包括驱动互动的一组事件处理脚本中最长的时长,即从用户开始互动到下一帧显示视觉反馈的那一刻。

INP 的目标是确保尽可能缩短从用户发起互动到下一帧绘制完成之间的时间,以尽可能缩短用户进行的所有互动或大多数互动。

注意 :Interaction to Next Paint (INP) 是一项待处理的核心 Web 指标指标,将于 2024 年 3 月 12 日取代 First Input Delay (FID)。INP 使用 Event Timing API 中的数据评估响应能力。如果互动导致页面无响应,用户体验会很糟糕。INP 会观察用户与网页进行的所有互动的延迟时间,并报告所有(或几乎所有)互动所低于的单个值。INP 较低意味着网页始终能够快速响应所有或绝大多数用户互动。

INP 得分是多少?

很难在响应能力指标上固定“良好”或“差”等标签。一方面,您需要鼓励优先考虑良好响应能力的开发实践。另一方面,您必须考虑这样一个事实,即人们用来设定实现预期开发期望的设备的功能有很大的差异。

为确保提供良好的响应速度的用户体验,

  • INP 低于或等于 200 毫秒表示您的网页具有良好的响应速度
  • INP 高于 200 毫秒且低于或等于 500 毫秒表示网页的响应能力需要改进
  • INP 高于 500 毫秒表示您的网页响应速度很差

优化由JavaScript导致的INP不佳

线上情况(chrome性能分析):

可以看到单个任务由超过600ms的情况,单个任务执行时间过长导致INP 高于 500 毫秒表示您的网页响应速度很差,需要优化耗时较长的任务。

通过分析得知长任务在执行发送曝光sendExp和updateComponent、updateChild等重渲染任务,“任务”是指浏览器执行的任何独立工作。任务涉及的工作包括渲染、解析 HTML 和 CSS、运行编写的 JavaScript 代码以及无法直接控制的其他事情。其中,程序员编写并部署到网络的 JavaScript 是主要任务来源。

如何优化耗时较长的任务,我们一般有以下几个方法:

1. 避免长任务

在国际往返一屏项目中,由于去程和返程来回横滑切换时需要切换航班卡片展示形态,在一些热门航线如北京往返香港,去程列表航班卡片数百个,返程航班卡片数百个,一次切换形态,props发送变化会造成大量的父子组件重新渲染,组件的重新渲染又会引起大量曝光请求重新发送,使得页面性能消耗巨大,严重时能造成页面崩溃。

props只要任何改变就会导致父子组件重渲染,有一些props发送改变时是不必要都去重渲染浪费性能,所以这里通过memo来缓存组件,只有必要内容发送改变时才进行重渲染

export default memo(FlightCard, (props, nextProps) => {
  // 只对比需要涉及组件重渲染的props属性,不一味任何props的改变都无脑重渲染
  const { isActive, moduleIndex, cardIndex, item = {}, taxLabel, firstClick } = props;

  const {
    isActive: nextIsActive,
    moduleIndex: nextModuleIndex,
    cardIndex: nextCardIndex,
    item: nextItem = {},
    taxLabel: nextTaxLabel,
    firstClick: nextFirstClick,
  } = nextProps;

  const preProps = {
    isActive,
    moduleIndex,
    cardIndex,
    item,
    taxLabel,
    firstClick,
  };

  const compareProps = {
    isActive: nextIsActive,
    moduleIndex: nextModuleIndex,
    cardIndex: nextCardIndex,
    item: nextItem,
    taxLabel: nextTaxLabel,
    firstClick: nextFirstClick,
  };

  try {
    // 重要信息相同则不重新渲染,避免性能过量消耗
    if (isEqual(compareProps, preProps)) {
      return true;
    }
  } catch (e) {
    return false;
  }
  return false;
});
2. 拆分长任务,请勿阻塞主线程

线上版本中,无论是上下滑动还是左右横滑,都会发送大量曝光请求,当频繁滑动的时候,网络请求列表中同时发送的请求数量过大,导致页面卡顿甚至崩溃,避免大量曝光请求同步发送,本着不阻塞主线程、拆分长任务的原则,采用防抖debounce + 分批处理曝光请求的思想:

  • 每次需要曝光的元素出现在视口,不是立马发送曝光请求而是将曝光信息添加到一个全局变量数组中,执行防抖函数进行发送曝光信息,只有到当用户停止新增曝光埋点一段时间之后,再统一发送收集到的曝光信息。
  • 分批处理曝光请求,设置每一批次发送固定数量的曝光信息,每发送一批数据延迟一段时间再继续发送后续批次,以免完全占用主线程导致用户操作回调排队过长
      // 确保全局exposures数组存在
      window.exposures = window.exposures || [];
      // 这个标志用于确保页面unload监听器只添加一次
      window.isBeforeUnloadEventListenerAdded = window.isBeforeUnloadEventListenerAdded || false;
      // 确保全局防抖
      window.sendExpTimeout = window.sendExpTimeout || null;
    
    // 发送全部曝光信息
    const sendExposures = debounce(() => {
      // 发送window.exposures中的曝光数据
      if (window && window.exposures && window.exposures.length > 0) {
        // 每发送100个曝光数据,等待1000 ms再发送,避免长期占用主线程
        sendRequestsInBatches([...window.exposures], 100, _sendExp);
      }
      // 防抖500 ms,用户500ms内无新增曝光操作才发送
    }, 500);
    
    // 批量发送曝光信息
    async function sendRequestsInBatches(dataArray, batchSize, onRequest) {
      for (let i = 0; i < dataArray.length; i += batchSize) {
        // 获取当前批次的数据
        const batch = dataArray.slice(i, i + batchSize);
        // 使用 Promise.all 并发发送请求
        Promise.all(batch.map(dataItem => {
          onRequest(dataItem);
        })).then(() => {
          // 发送完这一批数据,在window.exposures中清除
          window && window.exposures.splice(0, batchSize);
        }).catch(() => {
          console.error("exp信息发送失败");
        })
        // 可能需要延迟一小段时间(1000 ms)以避免完全占用网络和CPU
        await new Promise(resolve => setTimeout(resolve, 1000));
      }
    }
    
    // 组件需要曝光
    const sendExp = () => {
        window && window.exposures.push(
      {
        logkey: dataExpKey,
        exargs: expTrackInfo.trackArgs,
        spm: spm,
        scm: expTrackInfo.scm || ''
      }
    )
    sendExposures();
    }
    

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

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

相关文章

【AI Agent系列】【MetaGPT多智能体学习】3. 开发一个简单的多智能体系统,兼看MetaGPT多智能体运行机制

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第一篇笔记。主要记录下多智能体的运行…

【论文精读】DALLE: Zero-Shot Text-to-Image Generation零样本文本到图像生成

文章目录 一、前言二、摘要三、方法&#xff08;一&#xff09;主要目标&#xff08;二&#xff09;stage 1&#xff1a;训练离散变分自动编码器&#xff08;dVAE&#xff09;&#xff08;三&#xff09;stage 2&#xff1a;训练自回归转换器&#xff08;四&#xff09;公式表达…

RT-Thread使用PWM时出现的问题(4.x版本)

编译出现问题 1. 发现对应的结构体没有相关参数 问题原因 这个字段是在后面的os版本新增的&#xff0c;导致前面的版本没法使用&#xff0c;这个字段是为了做兼容高级定时器部分的处理 处理方案 第一种最简单&#xff0c;就是升级os版本。&#xff08;推荐&#xff09;第二…

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…

10.selenium的基本使用

selenium是一个关于爬虫功能python的库&#xff0c;它的整体逻辑与之前的请求爬虫思路不同。selenium是模拟出一个浏览器&#xff0c;你通过代码操作这个浏览器从而获取一些信息&#xff0c;比如执行click()就相当于点击了浏览器中的某个元素&#xff0c;相当于是针对浏览器的鼠…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量&#xff1a;定义整数变量n和k&#xff0c;分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num&#xff08;用来记录当前报的数&#xff09;和peopleIndex&#xff08;用来记录当前报数的小朋友的索引&#xff09;。 初始化小朋…

《CrackCollect》

CrackCollect 类型&#xff1a;益智学习 视角&#xff1a;2d 乐趣点&#xff1a;趣味化英语学习&#xff0c;闯关增加学习动力 时间&#xff1a;2019 个人职责&#xff1a; 1、所有功能的策划讨论 2、所有开发工作 3、所有上架工作 此游戏旨在针对英语水平处于初级阶段的人&…

揭示 Wasserstein 生成对抗网络的潜力:生成建模的新范式

导 读 Wasserstein 生成对抗网络 (WGAN) 作为一项关键创新而出现&#xff0c;解决了经常困扰传统生成对抗网络 (GAN) 的稳定性和收敛性的基本挑战。 由 Arjovsky 等人于2017 年提出&#xff0c;WGAN 通过利用 Wasserstein 距离彻底改变了生成模型的训练&#xff0c;提供了一个…

前端监控与埋点

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

SINAMICS V90 PN 指导手册 第6章 BOP面板 LED灯、基本操作、辅助功能

概述 使用BOP可进行以下操作&#xff1a; 独立调试诊断参数查看参数设置SD卡驱动重启 SINAMICS V90 PN 基本操作面板 LED灯 共有两个LED状态指示灯&#xff0c;(RDY和COM)可用来显示驱动状态&#xff0c;两个LED灯都为三色(绿色/红色/黄色) LED灯状态 状态指示灯的颜色、状…

什么是VR虚拟现实|虚拟科技博物馆|VR设备购买

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟出的一种全新的人机交互方式。它可以通过专门的设备&#xff08;如头戴式显示器&#xff09;将用户带入一个计算机生成的虚拟环境之中&#xff0c;使用户能够与这个虚拟环境进行交互…

1小时网络安全事件报告要求,持安零信任如何帮助用户应急响应?

12月8日&#xff0c;国家网信办起草发布了《网络安全事件报告管理办法&#xff08;征求意见稿&#xff09;》&#xff08;以下简称“办法”&#xff09;。拟规定运营者在发生网络安全事件时应当及时启动应急预案进行处置。 1小时报告 按照《网络安全事件分级指南》&#xff0c…

centos7单节点部署ceph(mon/mgr/osd/mgr/rgw)

使用ceph建议采用多节点多磁盘方式部署&#xff0c;本文章仅作为单节点部署参考&#xff0c;请勿用于生产环境 使用ceph建议采用多节点多磁盘方式部署&#xff0c;本文章仅作为单节点部署参考&#xff0c;请勿用于生产环境 使用ceph建议采用多节点多磁盘方式部署&#xff0c;…

2024年2月文章一览

2024年2月编程人总共更新了5篇文章&#xff1a; 1.2024年1月文章一览 2.Programming Abstractions in C阅读笔记&#xff1a;p283-p292 3.Programming Abstractions in C阅读笔记&#xff1a;p293-p302 4.Programming Abstractions in C阅读笔记&#xff1a;p303-p305 5.P…

如何在jupyter notebook 中下载第三方库

在anconda 中找到&#xff1a; Anaconda Prompt 进入页面后的样式&#xff1a; 在黑色框中输入&#xff1a; 下载第三方库的命令 第三方库&#xff1a; 三种输入方式 标准保证正确 pip instsall 包名 -i 镜像源地址 pip install pip 是 Python 包管理工具&#xff0c;…

2024年腾讯云优惠券领取页面_代金券使用方法_新老用户均可

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

【IC前端虚拟项目】inst_buffer子模块DS与RTL编码

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 需要说明一下的是,在我所提供的文档体系里,并没有模块的DS文档哈,因为实际项目里我也不怎么写DS毕竟不是每个公司都和HISI一样对文档要求这么严格的。不过作为一个培训的虚拟项目,还是建议在时间充裕…

PaddleOCR的部署教程(实操环境安装、数据集制作、实际应用案例)

文章目录 前言 PaddleOCR简介 一、PaddleOCR环境搭建 因为我之前安装过cuda和cudnn&#xff0c;查看cuda的版本根据你版本安装合适的paddlepaddle版本&#xff08;之前没有安装过cuda的可以看我这篇文章Ubuntu20.04配置深度学习环境yolov5最简流程&#xff09; 1.创建一个…

ESP32 partitions分区表的配置

由于在使用ESP32会遇到编译出来的bin文件大于分区表的时候&#xff0c;因此需要我们修改分区表或者使用自定义分区表的方式来解决。&#xff08;项目是使用VScode来搭建和调试的&#xff0c;VScode YYDS&#xff09; 具体分区标的含义这里就不讲了&#xff0c;网上有很多文档介…

【MySQL】:高效利用MySQL函数实用指南

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL函数概论二. 字符串函数三. 数值函数四. 日期函数五. 流程函数&#x1…