Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂,也可能很简单,今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 

startDemo() {this.processing = true// 创建复杂数据结构const data = [];for (let i = 0; i < 5000; i++) {const innerArray = [];for (let j = 0; j < 5000; j++) {const innerObject:any = {};innerObject.value = Math.random();innerArray.push(innerObject);}data.push(innerArray);}// 循环嵌套循环处理数据_.forEach(data, (innerArray) => {_.forEach(innerArray, (innerObject) => {innerObject.value = Math.pow(innerObject.value, 2);});innerArray = _.sortBy(innerArray, 'value');});// 模拟延迟以增加计算量setTimeout(() => {this.processing = false}, 2000);}

演示结果:

导致浏览器崩溃的问题在于:

首先,创建了一个非常大的数据结构,包含5000个内部数组,每个内部数组有5000个对象。这将占用大量的内存。

然后,在两个嵌套的 forEach 循环中,对数据进行处理。对于如此大规模的数据结构,这将导致非常高的计算负载,消耗大量的 CPU 资源和时间。

接下来,在延迟操作中使用了 setTimeout,将操作延迟了2秒。尽管这是为了模拟一个长时间运行的处理过程,但在这段时间内,浏览器将受到很大的压力,并且可能变得无响应或崩溃

如何优化呢:

1.减少数据规模:由于数据规模非常大,可以考虑减少内部数组的数量或对象的数量,以降低内存占用和计算负载。

2.分批处理:将数据分批处理,而不是一次性处理整个数据结构。可以使用分页或分块的方式,每次处理一部分数据,然后等待一段时间,再处理下一部分数据。这样可以避免长时间的单一计算任务对浏览器的影响。

3.使用 Web Workers:将数据处理和排序操作放在 Web Worker 中进行。Web Worker 可以在后台线程中执行代码,避免阻塞主线程,从而提高浏览器的响应性能。

4.优化算法和数据结构:如果可能的话,可以考虑使用更高效的算法和数据结构来进行数据处理和排序,以减少计算复杂度和提高性能。

优化后demo:(处理方式用的是分批处理)

startProcessing() {this.processing = true;this.currentPage = 0;this.data = [];for (let i = 0; i < 5000; i++) {const innerArray = [];for (let j = 0; j < 5000; j++) {const innerObject:any = {};innerObject.value = Math.random();innerArray.push(innerObject);}this.data.push(innerArray);}const pageSize = 100;this.numPages = Math.ceil(this.data.length / pageSize);const processPage = () => {const start = this.currentPage * pageSize;const end = Math.min((this.currentPage + 1) * pageSize, this.data.length);const pageData = this.data.slice(start, end);_.forEach(pageData, (innerArray) => {_.forEach(innerArray, (innerObject) => {innerObject.value = Math.pow(innerObject.value, 2);});innerArray = _.sortBy(innerArray, 'value');});this.currentPage++;if (this.currentPage < this.numPages) {setTimeout(processPage, 0);} else {this.processing = false;}};setTimeout(processPage, 0);}

 

 虽然是一个简单低级的错误,但是错误实实在在发生在身边,在数据量小的时候可能任何写法都没有区别,随着你的项目的成长,问题是逐步暴露的,只能一一解决。

 

 

 

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

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

相关文章

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

软考:中级软件设计师:计算机存储结构,cache,局部性原理,RAM和ROM,磁盘结构和计算

软考&#xff1a;中级软件设计师:计算机存储结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

用git下载gitee上的项目资源

目录 用git下载gitee上的项目资源 用git 的clone 命令 然后到gitee上复制相关的下载地址&#xff1a; 粘贴到clone后面即可&#xff08;注意地址与clone之间有空格&#xff01;&#xff01;&#xff01;&#xff09; 运行结果&#xff1a; 用git下载gitee上的项目资源 用git…

软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式 概述 行为型设计模式是软件设计模式中的一类&#xff0c;用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;&#xff1a;定义了…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【随手记】使用Flask做代理为虚拟机提供pip源

最近在重做虚拟机环境&#xff0c;虚拟机不可连外网&#xff0c;最初python包都是通过离线whl进行安装。但是离线文件已经找不到了&#xff0c;不想重新去一个个下载&#xff0c;而且本地环境跟虚拟机环境也不一致&#xff0c;pip download可能会遇到版本问题&#xff0c;遂考虑…

【对象存储】那些事

最近在某个项目中使用了对象存储。以前看过一个新闻&#xff1a;某公司的对象存储被盗刷&#xff0c;一夜之间账户欠费几十万&#xff01;我们这点小买卖可经不起这么折腾&#xff01;所以下功夫研究了下&#xff0c;防患于未然。 说到防盗刷&#xff0c;我们还得了解对象存储是…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

(五)python实战——使用sqlalchemy完成Sqlite3数据库表的增、删、查、改操作案例

前言 本节内容我们使用sqlalchemy框架完成Sqlite3数据库表的增删查改等常规操作&#xff0c;相较于原生Sqlite的数据库操作&#xff0c;sqlalchemy通过ORM映射完成实体对象的映射&#xff0c;通过映射关系完成对象和数据的转换&#xff0c;完成数据的操作。 正文 ①在项目中…

Matlab|改进的粒子群算法优化支持向量机(回归拟合)

作者在前面的文章中介绍了粒子群算法的原理及其2种改进算法&#xff0c;本文将基于这三种优化方法&#xff0c;应用于支持向量机进行预测&#xff0c;并对比改进算法与标准粒子群算法的预测性能&#xff0c;结果显示改进后的方法能够得到更佳的预测效果。 00 文章目录 1 支持…

jupyter中如何管理内核

1、jupyter notebook如何和已有的虚拟环境关联起来&#xff1a; 如果在电脑中某个conda的虚拟环境中已经安装了jupyter&#xff0c;其他虚拟环境想要作为内核在jupyter中使用&#xff0c;分为两个步骤&#xff1a; 第一步&#xff1a;在没有jupyter的环境中下载ipykernel&…