一次性能问题排查记录

129 阅读2分钟

目的

这次排查用了performance面板,但是当时并没有定位到具体的问题,这篇文章是在知道原因的情况下,去反推当时能通过performance面板排查出具体原因的步骤

问题现象

某个页面,在客户环境中,关闭时会卡顿几秒钟,但在本地的开发、测试、演示环境均是正常的
而且,只有切换页面时会出现,仅仅在页面内操作功能按钮并没有卡顿现象

image.png

排查过程

第一反应是通过performance面板录制,发现调用了很多次qe函数,而这个函数最终调用了vue的$destory

image.png

初步定论

因为这个页面比较简单,且在表格仅有几项内容时也会多次调用$destory,因此初步怀疑是有定时器。不过实际中并没有发现定时器,且页面也没有注册了destory,页面内的弹窗组件也是通过v-if显示的,因此没找到头绪

可以看到,页面卡顿的原因是script不断的执行,因此基本可以排除内存泄露的情况

同事,script的执行文件都是vue.min.js,并没有指向业务代码,因此方向又断了一条

到这里,只知道页面卡顿是由于不停的调用destory函数,我就没继续通过performance排查了。

实际上最终的原因是选择用户的下拉框,客户的用户有一万多条,destory函数就是处理这个el-option的

思考-当时应该如何通过performance排查出这个bug?

当时应该在script中打断点,在destory中查看被销毁的元素是什么类型

image.png

  • 在打断点后多次执行,就能看到排除页面布局、表单的组件后,后面的大量重复的被destory元素都是el-select-dropdown__item,基于此就能得到是select的option被大量渲染导致的卡顿

结论

排查时,可以针对重复执行的代码,打断点查看