Skip to content

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 耗时。

当前数据(1.9.x)

数字单位:打字/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 修复前后(10–50 万字,默认档)

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,主线程冻结),官方无分块/异步方案——超大文档建议宿主侧展示加载态;纯段落构成的解析明显更快

Clone this wiki locally