Univer 性能测试:3 组测试和 6 个阈值,定位表格卡顿与内存涨量
【免费下载链接】univerUniver is a full-stack framework for creating and editing spreadsheets / word processor / presentation on both web and server.项目地址: https://gitcode.com/GitHub_Trending/un/univer
Univer 是用于在 Web 和服务端创建、编辑电子表格、文档与幻灯片的全栈框架。本文带你跑通仓库里的 3 组性能测试,回答两个高频疑问:大数据表格卡顿一滚就掉帧是不是真 bug?每开一次工作簿,Univer 内存占用涨 200KB 算不算泄漏?
结论先说:阈值都写死在 e2e 目录里,不用拍脑袋。
怎么跑起来:3 组性能测试 🏃
两条命令,先起演示站(端口 3000),再跑 Playwright:
pnpm dev:e2e pnpm test:e2e三组测试各管一件事:
| 文件 | 验证内容 | | e2e/perf/scroll.spec.ts | 5 种数据下的滚动 FPS | | e2e/memory/memory.spec.ts | 实例创建、销毁后内存是否释放 | | e2e/disposing/disposing.spec.ts | 反复加载/卸载工作簿不出错 |
6 个阈值速查:内存阈值怎么定 📉
下表数字直接取自仓库常量,出处文件附后:
| 指标 | 阈值 | 出处文件 | 为什么是这个数 | | 单元内存涨量 | ≤1MB | memory.spec.ts | 两轮加载释放数据后的差值,应只是"单元格数据"级别 | | 二次实例涨量 | ≤200KB | memory.spec.ts | 销毁后重建,只该多出编译代码与全局缓存 | | 整体内存涨量 | ≤6MB | memory.spec.ts | 代码注释原话:给编译代码和全局缓存留余量,但必须装不下一个 Univer 对象 | | 空表格滚动 | >50 FPS | scroll.spec.ts | 最严:没数据的裸画布理应满帧 | | 冻结窗格滚动 | >30 FPS | scroll.spec.ts | 冻结把画布拆成多层,门槛略降 | | 合并单元格滚动 | >20 FPS | scroll.spec.ts | 合并区跨大块区域,绘制更贵 | | 数据溢出滚动 | >50 FPS | scroll.spec.ts | 横向溢出是真实操作高频动作 | | 密集文本滚动 | >25 FPS | scroll.spec.ts | 满屏文字加样式,负载最重 |
FPS 判断用的是严格大于(toBeGreaterThan),"刚好等于 50"也算挂。
结果去哪看:测出数字后先查哪三个地方
结果落在三个地方:
- 控制台:滚动测试每轮打印 fps、medianFrameTime(中位帧耗时)、max10FrameTimes(最慢 10 帧)。
- 快照文件:内存测试会把 memory-first.heapsnapshot、memory-second.heapsnapshot 写进 test-results/,用 Chrome DevTools 的 Memory 面板打开。
- 遥测:SHOULD_REPORT_TO_POSTHOG=true 时,3 个内存指标和 5 个 FPS 指标经 e2e/utils/report-performance.ts 上报,方便跨版本对比趋势。
内存测试的走位:建实例 → 加载数据再释放一次 → 再加载一轮算差值 → 销毁 → 建第二个实例 → 再销毁算差值,全程对比的是 JSHeapUsedSize。
FPS 低于阈值先查什么 🔍
先别怪渲染器,看帧耗时分布:
- max10FrameTimes 只有个别尖峰、其余帧平稳 → 单帧问题,查 GC 时机、字体加载、画布 resize。
- 整段 fps 持续偏低 → 真渲染问题。按数据类型缩圈:空表正常、合并格差?问题就在合并区绘制,跟数据量无关。
误报提醒:FPS 吃机器性能,CI 的盒子跑不满本地开发机。跨环境差 5 帧不算回退,同机同版本对比才有意义。
电子表格 FPS 与内存泄漏检测:怎么判定真泄漏 ⚠️
内存测试红了,先别盯数字,盯快照:打开两份 heapsnapshot 做"比较快照",看第二类实例比第一类多驻留了哪些对象类型。
三个常见误报:
- GC 不是瞬时的。测试每步采样前等 5 秒,仍可能残留。数值贴线就重跑一遍,看波动幅度再下结论。
- 对比口径只有 JSHeapUsedSize。canvas/WebGL 里的显存不计入,别把画布开销算进泄漏。
- disposing 测试通过 ≠ 内存释放。它只断言"没抛 pageerror",证明不崩,不证明干净。
不达标时的处理顺序
- 同机、同浏览器、同数据复现,先排除环境。
- FPS 掉帧:看帧耗时分布,区分单帧尖峰和持续掉帧。
- 内存超线:diff 两份堆快照,定位对象类型。
- 数据规模:perf 数据文件都是固定构造(如密集文本 1200 行 × 80 列),先确认该规模达标,再谈更大数据。
- 二分提交:前三步都排除后再用。
不同开发阶段该盯哪组测试
- 日常开发:各包的 vitest 单测即可,e2e 不用碰。
- 发版前:e2e/perf + e2e/memory,这两组是 Univer 性能测试的核心。
- 长开页面(协作场景一天不关):加跑 e2e/disposing。
- 公式引擎:packages/engine-formula/ 有 1500 多个文件、数百个函数,但仓库没有给它设性能阈值,公式相关的 e2e 只有渲染视觉回归。要量计算耗时,得自己加测。
【免费下载链接】univerUniver is a full-stack framework for creating and editing spreadsheets / word processor / presentation on both web and server.项目地址: https://gitcode.com/GitHub_Trending/un/univer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考