Repository navigation
Performance
CatsInJune edited this page Oct 31, 2026
·
2 revisions
本页记录长文档(万字符级)编辑性能的测量方法与当前数据。所有数据为开发机单点测量(macOS + Chrome,CDP 驱动),用于版本间与配置间的横向对比,不构成绝对承诺。
设施随仓库发布在 site/(bench.html + site/src/bench.tsx + site/scripts/perf-bench.mjs),只服务基准、不进构建产物:
node site/scripts/perf-bench.mjs # 全矩阵
node site/scripts/perf-bench.mjs --only lib-30k # 按名称过滤
node site/scripts/perf-bench.mjs --profile custom-30k # 额外采样 CPU profile 并分析热点结果写入 site/bench-results/<name>.json(CPU profile 同目录)。
两种模式:
-
mode=lib—— 用 npm 构建产物dist里的MarkdownWysiwygEditor,即真实用户路径 -
mode=custom—— 直接引用src自组扩展,提供noToc/noFind/noSlash/noTypo/noBlockDrag/noPaste/noDrop/noResize/noChart/noComments/noShortcut等减法开关,用于归因某个能力对性能的影响
文档构成(variant): mixed 报告风混合结构(标题/列表/表格/代码块)、paragraphs 纯段落、headings 标题密集。
采样动作: 持续打字(e2e 键盘到渲染延迟)、Enter、大事务(bigTx,整段替换/粘贴级别)、undo、getMarkdown()、滚动帧率、内存、editor-ready 耗时。
数字单位:打字/Enter/大事务/getMarkdown 为毫秒(P50),滚动为帧间隔。
| 场景 | 打字 P50 / P95 | 大事务 P50 |
getMarkdown P50 |
editor-ready |
|---|---|---|---|---|
| lib·1 万字·混合 | 3.6 / 4.8 | 32.7 | 2.2 | — |
| lib·3 万字·混合 | 5.1 / 6.5 | 158.3 | 6.1 | — |
| lib·3 万字·混合(精简配置) | 4.1 / 6.0 | 172.6 | 5.0 | — |
| lib·6 万字·混合 | 7.2 / 11.5 | 492.5 | 13.3 | — |
| lib·6 万字·纯段落 | 3.9 / 6.8 | 73.0 | 7.3 | — |
| lib·6 万字·标题密集 | 8.2 / 12.3 | 262.0 | 9.3 | — |
| custom·3 万字·全功能 | 3.6 / 6.2 | 160.6 | 4.0 | 218 |
| custom·3 万字·minimal | 3.9 / 5.6 | 143.0 | 6.4 | 216 |
| custom·3 万字·关目录 | 3.1 / 5.5 | 145.7 | 3.5 | 231 |
| custom·3 万字·关查找 | 3.4 / 5.4 | 153.1 | 6.1 | 215 |
| custom·6 万字·全功能 | 6.3 / 10.4 | 485.6 | 8.3 | 377 |
| custom·6 万字·关查找 | 5.9 / 8.1 | 452.4 | 4.3 | 355 |
1.9.2 修复了两个随规模放大的每事务固定税(emoji storage 无缓存重算、目录扩展全文档双遍历)。同条件前后对比(单位:汉字,打字/Enter 为毫秒):
| 指标 | 10 万字 | 20 万字 | 30 万字 | 50 万字 |
|---|---|---|---|---|
| 打字 P50 前→后 | 10.6→6.3 | 32.3→11.8 | 57.6→17.6 | 126.2→30.4 |
| Enter P95 前→后 | 16.8→11.3 | 49.4→15.5 | 63.7→20.0 | 215.6→34.9 |
| 滚动帧 P95 前→后 | 满帧 | 满帧 | 33.4→16.8 | 83.4→16.7(12fps→满帧) |
| 全选加粗 前→后 | 1.34→1.19s | 4.78→3.90s | 8.92→8.69s | 26.8→25.8s |
| 堆内存(GC 后) | 27MB | 36.6MB | 46.3MB | 110.9→61.7MB |
-
toc/onTocChange显式开启的宿主仍付目录扫描(20 万字打字 P50 31ms)——「谁用谁付」 - 大事务只改善 4~18%:主成本在 prosemirror-transform 位置映射与 tiptap
getChangedRanges(上游固有)
- 打字延迟与文档规模线性相关但基数小:3 万字符 P50 ≈ 5ms,6 万字符 ≈ 7ms,都在一帧预算内
- 大事务(bigTx)是重头:6 万字符混合文档的一次整段替换约 450–500ms。这与文档结构强相关——同规模纯段落只要 73ms
-
关目录/关查找对打字影响很小(减法实验里 < 1ms 级差异);对初始化(
editor-ready)也仅约 20–60ms 级 - 滚动在所有场景保持满帧(P95 ≈ 16.7ms)
- 超长文档优先考虑分段编辑;若必须整篇,纯段落构成(少表格、少代码块)明显更便宜
- 编辑器 props:
toc、findReplace、markdownPaste、markdownFileDrop等可按需关闭(详见 README 的 props 表);1.9.2 起目录扩展只在传toc或onTocChange时注册,不需要时不用关 - 初始装载(markdown 解析+建树)随规模线性变贵(50 万字约 10s,主线程冻结),官方无分块/异步方案——超大文档建议宿主侧展示加载态;纯段落构成的解析明显更快