当前位置: 首页 > Web前端 > JavaScript

后端请求的数据量过大,导致返回给用户的结果过长【一个调优过程】

时间:2023-03-26 22:28:14 JavaScript

【项目背景说明】有一张表描述了Snapshot-1和Snapshot-2的对比,数据比对的结果由后端计算,前端只需要负责渲染即可。后端返回的数据本质上是一个“森林”,每棵“树”分为三层,即:类型/类名/对象名。由于每棵树的计算量都比较大,子节点也很多,因此在前端渲染时采用懒加载的方式进行优化,即只有当用户展开某一层时才会调用后端请求数据.因此,当页面第一次呈现时,它显示森林中所有树的第一层。Diff表除了在页面显示数据外,还支持csv下载。由于csv需要获取全量的对比数据,即整个森林,当用户点击csv下载时,会先调用后端获取全量数据,然后csv格式,最后输出。[问题]有用户反馈说:CSV下载等了好久才加载,怎么回事?【排错过程】1、在上述环境中,我们有一个本地开发环境(对应我们自己的本地数据库,可以操作后台代码和前端代码)。用户prod环境有问题(本地前端无法调用prod环境的DB)2.找到瓶颈,打开用户的report。数据量确实很大。点击csvdownload,下载一个diff文件大约需要30秒。换句话说,代码逻辑没有问题,但是速度慢。打开控制台可以看到数据返回时间。其实时间不是很长,只有7s,所以时间瓶颈不在这里。接下来就是看api回调中的处理逻辑可以优化什么。但是如何获取用户的数据呢?由于本地开发环境无法连接到prod数据库。【解决方案】:在开发者模式下,可以获取api返回的数据,保存为json,在前端代码中导入进行处理。但是由于返回结果太大,无法加载response,“复制粘贴”计划失败。【解决方法】:右键点击url,找到CopyascURL,在命令末尾加上“>>1.txt”,响应结果可以直接输出到文件,不用命令行,方便用于复印。一切就绪后,开始检查瓶颈。在csv格式的每个函数后,console.log一个时间戳,方便查看哪里耗时。最后发现sort函数占用了很多时间,因为有2层for循环。再看代码,其实调用返回的API在后端处理的时候,已经是有序的了,不需要前端“多做”。综上所述,删除前端排序功能即可。(省略后续测试步骤。。。)【知识点复习】curl是一种常用的命令行工具,用于请求web服务器。它的名字意思是客户端URL工具。有很多不同的命令行参数,方便开发者在cmd中请求api。