页面性能优化

优化点

解决方案

效果

  1. 双向绑定数量过多

竞对设置单元格内部涉及双向绑定的输入组件过多,线上页面最多有88个该和抽屉中的编辑表格一样的组件,共计930+个(按每行最少6个来计算的)双向绑定的组件,严重拖累页面性能。

数据计算依据:88 = 竞对信息单元格数,930 = 155(编辑表格行数)*6(每行最低的双向绑定组件数)

问题截图

将竞对设置的编辑表格改为纯文本展示表格全局仅维护一个编辑表格,点击对应单元格的编辑按钮后,显示抽屉,将目标单元格数据带入编辑表格进行编辑操作,编辑完成后将修改后的数据同步到目标单元格对应的数据对象中。

通用的编辑表格组件数量由88个缩减到1个,双向绑定组件由930+个缩减到20个以内(线上数据每个编辑表格大概2-3行)

优化前

优化后

M3 Mac

进入页面后13s后可以进行页面交互

感官卡顿时间:6s

滚动会有明显卡顿

进入页面后6s后可以进行页面交互

感官卡顿时间:1s

滚动无卡顿

Windows测试机

页面崩溃无法打开

刷新后13s后可以进行页面交互

感官卡顿时间:5s

滚动无卡顿

2. 高并发重复请求​

这是在子组件请求接口,没有做接口缓存,导致调用N次请求。

缓存后,不切换城市只请求一次。

3. 树型选择器渲染函数时间复杂度高

线上场景组织节点数为5377个,当选择父级节点时,树型选择器renderTag方法使用了O(n2)的查找父节点遍历方法。

该renderTag方法在初始化、点击选择框、选择值、选择框失焦等多个事件中都会触发。

问题截图:

使用Map进行缓存,将函数时间复杂度降为O(n)

              // 优化前:filter+some 二层嵌套循环 时间复杂度为O(n2)const allTagList = data.filter((item) => {// 如果 item 有父节点,检查父节点是否选中if (item.parentId) {// 查找时间为O(n)return !data.some((dataItem) => dataItem.id === item.parentId);}// 如果 item 没有父节点,直接选中return true;});
// 优化后:Map直接读数时间复杂度为O(n)
const allTagList = data.filter((item) => {// 如果 item 有父节点,检查父节点是否选中if (item.parentId) {// 使用 Map 的 has 方法,时间复杂度 O(1)return !selectedIdMap.has(item.parentId);}// 如果 item 没有父节点,直接选中return true;});

优化前

优化后

M3 Mac

点击全选果蔬组织

JS逻辑层执行时间4046ms

页面卡顿时间:6s

点击选择果蔬中心全选

JS逻辑层执行时间 6ms

页面卡顿时间:2s

Windows测试机

点击全选果蔬组织,页面崩溃

点击选择果蔬中心全选

页面卡顿时间:4s

感官卡顿计时方式

  1. 开始计时:使用计时器,点击全选果蔬按钮后开始计时

  2. 结束计时:页面可以随意滚动交互

感官卡顿时间 = 结束时间点-开始时间点

JS逻辑计时方式

在renderTag问题函数的开始结束位置获取时间戳,在函数执行完毕后打印两者差值。

JS逻辑层执行时间 = 点击全选果蔬按钮后控制台输出的最长renderTag执行时间

4. 写法优化。

使用Set (n1)查找

避免模版直传方法渲染,替换为计算属性

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

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

相关文章

详细说明零拷贝

详细说明零拷贝【一】零拷贝介绍【1】说明【2】为什么需要零拷贝?—— 传统数据传输的问题【3】零拷贝的核心优化【4】零拷贝的实现方式(1)mmap(内存映射)(2)sendfile(Linux 系统调用…

docker部署自己写的c++http服务器教程

我用的是ubuntu 22.04环境下 qt c 写的应用程序,是终端程序,不是界面,然后用linuxdeployqt工具将其打包成了AppImage可执行文件,以上是部署前的准备工作,需要确保AppImage可执行文件在自己的ubuntu上可以运行才能执行以…

Caffeine 缓存库的常用功能使用介绍

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

C# _列表(List<T>)_ 字典(Dictionary<TKey, TValue>)

目录 列表(List)特点 创建列表 RemoveAll 删除与之条件相匹配的数据 会返回删除的个数 Capacity 获取或设置列表的容量 更多方法可参照上篇文章:C#_ArrayList动态数组 字典(Dictionary)特点 定义一个字典 向字…

【实时Linux实战系列】实时网络控制与调度

在实时控制系统中,网络调度是确保实时数据流传输和处理不受延迟影响的关键。实时网络控制与调度技术对于工业自动化、金融交易、多媒体流等领域至关重要。通过合理设计网络调度策略,可以显著提高系统的实时性和可靠性。本文将介绍如何在实时控制系统中实…

Qwen3-Coder:介绍及使用 -- 超强AI编程助手

更多内容:XiaoJ的知识星球 目录一、Qwen3-Coder模型介绍1.预训练阶段(Pre-Training)2.后训练阶段(Post-Training)1)Scaling Code RL: Hard to Solve, Easy to Verify2)Scaling Long-Horizon RL二…

uniapp 如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。

如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。输入法出来后,设置了自动将页面顶上来的配置:pages.json"softinputMode": "adjustResize""g…

深入了解 Kubernetes(k8s):从概念到实践

目录 一、k8s 核心概念 二、k8s 的优势 三、k8s 架构组件 控制平面组件 节点组件 四、k8s docker 运行前后端分离项目的例子 1. 准备前端项目 2. 准备后端项目 3. 创建 k8s 部署配置文件 4. 部署应用到 k8s 集群 在当今云计算和容器化技术飞速发展的时代&#xff0c…

Android User版本默认用test-keys,如何改用release-keys

Android User版本 默认用test-keys, 如何改用release-keys 开发云 - 一站式云服务平台 --- build/core/Makefile | 5 1 file changed, 5 insertions() diff --git a/build/core/Makefile b/build/core/Makefile index --- a/build/core/Makefile b/build/core…

从零开始学习Dify-数据库数据可视化(五)

概述上一篇文章我们围绕 Excel 文件展开数据可视化教学,逐步掌握了数据导入、图表构建和 AI 智能分析。在实际业务环境中,很多数据并不是保存在表格中,而是存储于数据库系统中,尤其是最常见的 MySQL。本篇作为本系列的第五篇&…

使用vue2和 element-ui 做一个点餐收银台系统前端静态项目

今天给大家分享一个 关于点餐收银台的静态网站,最近一直在练习前端项目,就使用vue2和 element-ui 做了一个 这样简单的 收银台系统。先给大家看一下 做出来的样子。 因为是练习项目 所以页面功能还是比较简单的。 使用的技术是: 技术栈 Vu…

Spring Boot自动配置原理深度解析

Spring Boot自动配置原理深度解析 一、自动配置核心概念 1.1 什么是自动配置 Spring Boot自动配置(Auto-Configuration)是其核心特性之一,能够根据项目依赖自动配置Spring应用程序。例如: 当检测到H2数据库依赖时,自动配置内存数据库当存在Sp…

关于 Apache Ignite 中 Job 调度(Job Scheduling)与冲突控制(Collision Control) 的机制说明

这段内容是关于 Apache Ignite 中 Job 调度(Job Scheduling)与冲突控制(Collision Control) 的机制说明。我来为你逐段解析,帮助你深入理解其原理和使用方式。🔍 一、核心概念:Job 调度与 Colli…

网络资源模板--基于Android Studio 实现的课程管理App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 登录页 首页 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可…

ROUGE-WE:词向量化革新的文本生成评估框架

一、ROUGE 基础与核心局限 ROUGE(Recall-Oriented Understudy for Gisting Evaluation) 是自动文本摘要与机器翻译的主流评估指标,由 Chin-Yew Lin 在2004年发表的论文中首次系统提出。其核心变体包括: ROUGE-N:基于…

MGER综合实验

一.拓扑二、实验需求 1、R5为ISP,只能进行IP地址配置,其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证,R5为主认证方; R2与R5之间使用ppp的CHAP认证,R5为主认证方; R3与R5之间使用HDLC封装; 3、R1、R2、R3构建一个MGRE环…

高可用集群Keepalived、Redis、NoSQL数据库Redis基础管理

1. 总结负载均衡常见的算法 轮询 (Round Robin):按顺序将请求依次分配给后端服务器,适合服务器性能相近的场景。 加权轮询 (Weighted Round Robin):在轮询的基础上,根据服务器的权重分配请求。 随机 (Random):随机选…

【深度学习】独热编码(One-Hot Encoding)

独热编码(One-Hot Encoding) 在机器学习中,数据预处理是不可或缺的关键一步。面对各种非数值类型的分类数据(Categorical Data),如何将其转换为机器学习模型能够“理解”的语言呢?独热编码&…

Promise完全体总结

我们在上篇文章提到了异步会导致无法通过返回值来获取函数的执行结果,我们通过传入一个回调函数的方式,以参数的形式获取到了我们想要获取的数据,但是这样如果需要对数据进行多次操作导致形成回调地狱那种不便于阅读以及护理的代码。为了解决…

SpringJDBC源码初探-DataSource类

一、DataSource接口核心作用 DataSource是JDBC规范的核心接口,位于javax.sql包中,用于替代传统的DriverManager获取数据库连接。Spring框架通过org.springframework.jdbc.datasource包对该接口进行了增强,提供连接池管理、事务绑定等高级特性…