性能优化问题思考总结

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();
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

酷开科技,让酷开系统成为现代生活的变革者

电视&#xff0c;从问世就一直受到人们的追捧。还记得小时候一家人围坐在电视机前的场景&#xff0c;小小的黑白屏幕&#xff0c;牢牢的吸引着大家的目光。随着科技的不断进步&#xff0c;我们的生活也发生了翻天覆地的变化。而电视&#xff0c;也从笨重的黑白电视变成了轻薄的…

jenkins + gitlab + nginx 自动部署(webhook)

一、意义 当代码仓库被更新时&#xff0c;Jenkins会自动拉取代码进行构建。 适用于测试环境 二、jenkins gitlab nginx 自动部署(webhook) 1.准备服务器 ①安装Jenkins&#xff08;Java17&#xff0c;tomcat9&#xff09; ②安装gitlab &#xff08;16&#xff09; ③…

深入理解Python中的JSON模块:基础大总结与实战代码解析【第102篇—JSON模块】

深入理解Python中的JSON模块&#xff1a;基础大总结与实战代码解析 在Python中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;模块是处理JSON数据的重要工具之一。JSON是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、API通信等领域。本文将…

2023 re:Invent 用 Amazon Q 打造你的知识库

前言 随着 ChatGPT 的问世&#xff0c;我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会 re:Invent 也带来了许多前言的技术&#xff0c;其中 Amazon CEO Adam Selipsky 在 2023 re:Invent 大会中介绍 Amazon Q 让我印象深刻&#xff0c;这预示着生成式 AI 的又一…

【wu-acw-client 使用】案例

wu-acw-client 使用 项目介绍&#xff0c;使用acw-client&#xff0c;创建对应Java项目的增删改查&#xff08;ORM&#xff1a;Lazy ORM、mybatis&#xff09;&#xff0c;项目模块架构&#xff1a;mvc、feign、ddd 演示项目环境&#xff1a;idea 、mac、mysql、jdk17 spring …

geotools解析shp 提示 opengis.*.SimpleFeatureType‘ 不在其界限内

问题:&#xff08; geotools.version&#xff1a;31-SNAPSHOT&#xff09; 解析shp文件时提示类型SimpleFeatureType不在其界限内 解决&#xff1a; 在引用处将org.opengis.feature.simple.SimpleFeatureType 改为 org.geotools.api.feature.simple.SimpleFeatureType

qt-C++笔记之使用QProcess去执行一个可执行文件时指定动态库所存放的文件夹lib的路径

qt-C笔记之使用QProcess去执行一个可执行文件时指定动态库所存放的文件夹lib的路径 参考博文&#xff1a; 1.C笔记之执行一个可执行文件时指定动态库所存放的文件夹lib的路径 2.Linux笔记之LD_LIBRARY_PATH详解 3.qt-C笔记之使用QProcess去执行一个可执行文件时指定动态库所存放…

LeetCode 0938.二叉搜索树的范围和:深度优先搜索(可中序遍历)

【LetMeFly】938.二叉搜索树的范围和&#xff1a;深度优先搜索&#xff08;可中序遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/range-sum-of-bst/ 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。…

数一满分150分总分451东南大学920电子信息通信考研Jenny老师辅导班同学,真题大纲,参考书。

记录用来打破的&#xff0c;信息通信考研Jenny老师2024级辅导班同学&#xff0c;数一满分150分&#xff0c;专业课920专业基础综合143&#xff0c;总分451分&#xff0c;一位及其优秀的本科985报考东南大学信息学院的学生&#xff0c;东南大学920考研&#xff0c;东南大学信息科…

查看NGINX版本

查看Nginx版本有几种常用方法&#xff1a; 命令行&#xff1a; 在Linux或macOS系统中打开终端&#xff0c;然后输入以下命令之一&#xff1a; nginx -v 或者 nginx -V -v 参数将输出简短的nginx版本信息。 -V 参数&#xff08;大写&#xff09;将输出更详细的版本和配置信息&am…

Zoho ToDo 满足您的需求:任务管理满足隐私和安全要求

任务管理工具已经成为我们日常生活中不可或缺的一部分&#xff0c;它们帮助我们处理各种事务&#xff0c;从杂项和愿望清单到管理截止日期和资源。这些工具不仅仅是简单的任务列表&#xff0c;它们掌握了项目的蓝图、雄心勃勃的目标和完成的最后期限。然而随着这些工具的使用越…

【web APIs】1、(学习笔记)有案例!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、概念二、使用步骤1.获取DOM对象2.操作元素内容3.属性修改3.1.常用属性修改3.2.控制样式属性3.3.操作类名(className) 操作CSS3.4.操作表单元素属性3.5.自定…

YOLOv9-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

小龙虾优化算法COA求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、小龙虾优化算法COA 小龙虾优化算法&#xff08;Crayfsh optimization algorithm&#xff0c;COA&#xff09;由Jia Heming 等人于2023年提出&#xff0c;该算法模拟小龙虾的避暑、竞争和觅食行为&#xff0c;具有搜索速度快&#xff0c;搜索能力强&#xff0c;能够有效平衡…

Windows已经安装了QT 6.3.0,如何再安装一个QT 5.12

要在Windows上安装Qt 5.12&#xff0c;您可以按照以下步骤操作&#xff1a; 下载Qt 5.12&#xff1a;访问Qt官方网站或其他可信赖的来源&#xff0c;下载Qt 5.12的安装包。 下载安装地址 下载安装详细教程 安装问题点 qt安装时“Error during installation process(qt.tools…

静态方法,类的主方法

静态变量 同一个类的不同实例对象&#xff0c;可以共用同一静态变量。&#xff08;如果有一个对象将静态变量更改&#xff0c;另外一个对象的静态变量也会随之更改&#xff09; 静态方法 使用类中的方法就必须将这个类实例化 &#xff0c;调用静态方法无需创造类的对象 实例 p…

【论文精读】LLaMA1

摘要 以往的LLM&#xff08;Large Languages Models&#xff09;研究都遵从一个假设&#xff0c;即更多的参数将导致更好的性能。但也发现&#xff0c;给定计算预算限制后&#xff0c;最佳性能的模型不是参数最大的&#xff0c;而是数据更多的。对于实际场景&#xff0c;首选的…

2024 CKS 题库 | 13、Container安全上下文

不等更新题库 CKS 题库 13、Container安全上下文 Context Container Security Context应在特定namespace中修改Deployment。 Task 按照如下要求修改 sec-ns 命名空间里的 Deployment secdep 用ID为 30000 的用户启动容器&#xff08;设置用户ID为: 30000&#xff09;不允许…

机器学习-01-课程目标与职位分析

总结 本系列是机器学习课程的第01篇&#xff0c;主要介绍本门课程的课程目标与职位分析 教材 数据挖掘与机器学习 课程教学方法 布鲁姆教学法 认知领域&#xff08;cognitive domain&#xff09; 1.知道&#xff08;知识&#xff09;&#xff08;knowledge&#xff09; 是指…

逆序或者正序打印一个数的每一位数,递归实现(C语言)

从键盘上输入一个不多于5位&#xff08;包括5位&#xff09;的正整数&#xff0c;要求 &#xff08;1&#xff09;求出它是几位数&#xff1b;&#xff08;2&#xff09;分别输出每一位数字&#xff08;3&#xff09;按逆序输出各位数字 &#xff08;1&#xff09;求出它是几位…