ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Slate v2 基准测试目标注册表(Benchmark Targets)实战:读懂 27 个 Targets 与报告生成链路

Slate v2 基准测试目标注册表(Benchmark Targets)实战:读懂 27 个 Targets 与报告生成链路 Slate v2 基准测试目标注册表Benchmark Targets实战读懂 27 个 Targets 与报告生成链路【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate本篇文章以仓库中的基准测试目标报告 benchmarks/targets/reports/slate-v2.md 及其数据源 benchmarks/targets/slate-v2.json 为核心系统讲解 Plate 项目中 Slate v2 性能基准测试的目标注册表Target Registry机制。读完你将掌握target 注册表的字段契约与状态判定逻辑、如何通过bench:targets:*系列命令列出、校验、运行与生成报告、27 个 target 的家族Family与指标Metric语义以及该机制如何替代旧的 Evidence Kit 成为基准测试决策的唯一权威来源。一、这份报告是什么从 Evidence Kit 到 Target Registry 的迁移枢纽benchmarks/targets/reports/slate-v2.md是一份由脚本自动生成的状态报告其唯一数据来源是benchmarks/targets/slate-v2.json报告中原文也明确声明 This report is generated frombenchmarks/targets/slate-v2.json。它与benchmarks/targets/README.md共同构成了项目基准测试工作的迁移脊柱migration spine。要理解这份报告的价值必须先理解它的背景项目经历了一次基准测试治理架构的迁移。旧的Evidence Kit位于benchmarks/editor/目录是迁移期间的历史导入/报告归档而新的Target Registry是当前与未来的权威。报告中明确写道Evidence Kit is legacy input during migration. Active benchmark decisions should use target ids from this registry, then feed those targets into benchmark runners, Autoresearch, and report generation.这句话的含义是所有活跃的基准决策必须引用注册表中的target id然后把 target 喂给三样东西——benchmark runners基准运行器、Autoresearch自动优化会话、report generation报告生成。旧的 Evidence Kit 只有在迁移期间才作为历史输入存在不再作为活跃决策的依据。这条治理规则的落地证据可以在 benchmarks/editor/iterations/003-evidence-control-plane.md 中看到该文档确立了未注册的旧 benchmark JSON 不再算作活跃证据的硬性规则Old benchmark JSON is discarded unless it is registered同时Benchmark runners still live with their owners——基准实现仍然放在它测量的运行时/包代码旁边而 Evidence Kit 只负责判定输出是否算当前证据。二、报告摘要速读数字背后的含义报告开头的 Summary 是理解整体健康度的最快入口- Targets: 27 - Required artifacts: 25 - Existing artifacts: 25 - Missing optional artifacts: 2 - Missing required artifacts: 0 - Status counts: ok25, missing-optional-artifact2逐项解读统计项数值含义Targets27注册表中登记的基准测试目标总数Required artifacts25标记为required: true的产物文件总数Existing artifacts25当前磁盘上实际存在的产物文件总数Missing optional artifacts2标记为可选required: false但尚未生成的产物数Missing required artifacts0必需的产物缺失数为 0这是健康的关键指标Status countsok25, missing-optional-artifact2按状态归类的 target 数两份缺产物文件的可选 artifact 分别对应两个 targetcore-transaction-current缺少.tmp/slate-v2/tmp/slate-transaction-benchmark.jsonhistory-retained-memory缺少.tmp/slate-v2/tmp/slate-history-retained-memory-benchmark.json由于这两个产物在注册表中被标记为required: false可选因此整体状态仍然是无必需产物缺失报告不会因此变红。这一设计允许团队在目标已登记、运行器已就绪、但结果尚未产出的阶段就先把 target 纳入治理避免了先有产物才能登记的鸡生蛋问题。三、Target 注册表的结构契约一个 target 包含什么报告只是视图真正的主数据在benchmarks/targets/slate-v2.json。该文件包含一个version: 1的注册表结构为顶层policy治理策略targets数组27 个目标对象。3.1 顶层 Policy四条治理原则{ policy: { authority: Benchmark targets are the future source of truth. Evidence Kit is a legacy import/report archive during migration., benchmarkCode: Benchmark implementation lives with the runtime/package code it measures., activeLoops: Autoresearch sessions optimize one target id at a time and own only active loop state., docs: Docs and research files are linked evidence, not benchmark control state. } }四条原则可以浓缩为权威性authoritytarget 注册表是未来的事实来源Evidence Kit 只是迁移期的历史归档代码归属benchmarkCode基准实现与它所测量的运行时/包代码放在一起即代码跟着所有者走活跃循环activeLoopsAutoresearch 会话一次只优化一个 target id且只拥有活跃循环状态临时状态不污染注册表文档边界docs文档与研究文件只是链接证据不是基准控制状态。3.2 Target 对象的字段契约benchmarks/targets/README.md给出了每个 target 的标准契约结合 JSON 实例可以逐一对应字段作用示例值id稳定的、面向命令的目标 idreact-huge-document-legacy-comparequestion该基准要回答的决策问题Does Slate v2 beat legacy Slate for 5,000-block React editing, selection, startup, and full-document replacement?owner运行时/包所有者slate-v2family/kind报告分组的维度react-large-document/slate-legacy-comparecwd/command仓库相对运行目录与运行命令.tmp/slate-v2bun run bench:react:huge-document:legacy-compare:localmetrics主指标、方向、单位、是否打印METRIC行react_huge_doc_legacy_compare_worst_p95_ratio/lower/ratio/truecorrectness防止为了提速而破坏编辑器行为的门禁命令bun checkartifacts该 target 产生的结果文件列表含required标记.tmp/slate-v2/tmp/...jsondocs支撑证据链接benchmarks/editor/research/evidence-source-map.md等thresholds晋升promotion/ 拉伸stretch/ 平台期plateau判定见下文migration迁移期溯源信息Evidence Kit 正在退役importedFrom: benchmarks/editor/research/benchmark-registry.json3.3 一个完整 target 示例精读以react-huge-document-legacy-compare为例完整展示其 JSON 结构字段说明已注释{ id: react-huge-document-legacy-compare, question: Does Slate v2 beat legacy Slate for 5,000-block React editing, selection, startup, and full-document replacement?, owner: slate-v2, family: react-large-document, kind: slate-legacy-compare, cwd: .tmp/slate-v2, command: REACT_HUGE_COMPARE_LEGACY_REPO../../../slate REACT_HUGE_COMPARE_DISPOSE_DELAY_MS0 REACT_HUGE_COMPARE_SPLIT_SELECTION1 REACT_HUGE_COMPARE_ISOLATE_SURFACES1 REACT_HUGE_COMPARE_SURFACESv2DefaultRenderAuto,v2DomPresent REACT_HUGE_COMPARE_BLOCKS5000 REACT_HUGE_COMPARE_ITERATIONS5 REACT_HUGE_COMPARE_TYPE_OPS10 bun run bench:react:huge-document:legacy-compare:local, metrics: { primary: react_huge_doc_legacy_compare_worst_p95_ratio, direction: lower, unit: ratio, printsMetric: true, upgrade: Primary metric is the worst p95 ratio across the 5,000-block default/render-auto and DOM-present product lanes versus legacy chunking-on. }, correctness: { command: bun check, policy: Promotion requires the benchmark p95 ratio plus the fast Slate v2 check suite. }, artifacts: [{ path: .tmp/slate-v2/tmp/slate-react-huge-document-legacy-compare-benchmark-compare-v2DefaultRenderAuto-v2DomPresent-blocks-5000-iters-5-ops-10-isolated-surfaces-split-selection-no-profile.json, required: true }], docs: { sources: [ benchmarks/editor/research/evidence-source-map.md, benchmarks/editor/iterations/003-evidence-control-plane.md, docs/plans/2026-06-01-react-huge-document-legacy-ar-perf.md ] }, thresholds: { promotion: react_huge_doc_legacy_compare_worst_p95_ratio1.5, stop: stop when the promotion target is stable across two correctness-green repeat packets or when the remaining owner needs architecture work }, migration: { importedFrom: benchmarks/editor/research/benchmark-registry.json, evidenceKitId: react-huge-document-legacy-compare, evidenceKitCategory: slate-react-huge-document-legacy-compare, evidenceKitActive: true } }这段结构透露了几个关键设计环境变量即参数对比配置5000 个块、5 次迭代、10 次输入操作、隔离 surface、拆分选择全部通过环境变量注入而不是硬编码在脚本里。这保证了同一命令可以在不同参数组合下复现主指标是最差 p95 比率react_huge_doc_legacy_compare_worst_p95_ratio取多个产品通道default/render-auto 与 DOM-present相对 legacy chunking-on 的最坏 p95 比值direction: lower表示数值越低越好晋升阈值为 ≤1.5正确性门禁与性能指标分离即使 p95 比率达标还必须bun check通过防止更快但坏了的假优化产物文件名自带完整参数指纹blocks-5000、iters-5、ops-10、isolated-surfaces、split-selection 等参数全部编码在文件名中天然支持多参数组合并存与对比。四、27 个 Target 全景按家族分组解读报告中的 Targets 表格| Target | Family | Metric | Status | Artifacts | Metric output |是 27 个 target 的状态快照。Metric output列有两类取值yestarget 的 benchmark 原生输出METRIC namevalue行printsMetric: trueAutoresearch 可以直接解析wrapped尚未输出原生 METRIC 行printsMetric: falseAutoresearch 需要用计时包装wrap timing来兜底。下面按家族Family把 27 个 target 归类梳理信息均来自注册表与报告4.1 core-current当前 Slate v2 核心路径成本7 个Target决策问题主指标core-editor-store编辑器 store 与公共快照面成本core_benchmark_secondscore-node-transforms结构化节点变换成本core_benchmark_secondscore-normalization-current当前规范化速度core_benchmark_secondscore-query-ref-observationquery/ref/observation 路径成本core_benchmark_secondscore-refs-projectionrefs 与投影路径成本core_benchmark_secondscore-text-selection文本与选区操作成本core_benchmark_secondscore-transaction-current仅当前事务路径成本core_benchmark_seconds状态missing-optional-artifact这组 target 回答的都是同一个问题当前实现里某条核心路径到底花多少时间它们不直接对比 legacy Slate而是作为当前current基准持续监控。4.2 core-compareSlate v2 是否追平 legacy Slate4 个Target决策问题主指标core-huge-document-compare核心大文档操作是否追平 legacycore_benchmark_secondscore-normalization-compare规范化是否追平 legacycore_benchmark_secondscore-observation-compare核心观察是否追平 legacycore_benchmark_secondscore-rich-text-operations-compare富文本编辑/变换/选区/导航是否追平 legacyrich_text_structural_ops_p95_ms其中core-rich-text-operations-compare值得特别关注它是灾难性富文本通道的结构化操作复合 p95RICH_TEXT_OPS_COMPARE_ITERATIONS51次迭代设定了三级阈值——first低于 legacy 10 倍、promotion低于 legacy 3 倍、plateau连续 2 个正确性通过的包且增益 5% 时停止。4.3 react-large-document5000 块大文档 React 性能6 个Target决策问题主指标react-huge-document-full全套大文档基准是否保持快速与局部化react_huge_doc_full_max_budget_ratioreact-huge-document-legacy-compare是否胜过 legacy5000 块编辑/选择/启动/整文档替换react_huge_doc_legacy_compare_worst_p95_ratioreact-huge-document-browser-traceChromium 中的 DOM 数/堆/长帧/交互 tracebrowser_trace_secondsreact-huge-document-slate-browser-tracelegacy chunk-on 的对照 tracebrowser_trace_secondsreact-huge-document-virtualized-type-to-paint虚拟化 surface 的 type-to-paint 延迟是否在交互预算内react_huge_doc_type_to_paint_p95_msreact-huge-document-overlaysoverlay 与部分 DOM 提升路径是否保持局部化benchmark_secondsreact-huge-document-full的阈值设计是分层推进的典型thresholds: { promotion: react_huge_doc_full_max_budget_ratio1 and react_huge_doc_full_failure_count0, stretch: react_huge_doc_full_max_budget_ratio0.67, plateau: stop after 2 correctness-green packets with less than 5% gain }晋升线是归一化预算比率 ≤1 且失败计数为 0拉伸目标stretch是 0.67即比预算快 50% 以上平台期判定用于终止优化循环避免无意义的边际收益追逐。react-huge-document-virtualized-type-to-paint的阈值更直白晋升react_huge_doc_type_to_paint_p95_ms75毫秒拉伸50并配套两条 Playwright 用例虚拟化 DOM 策略控件/指标暴露、动态块高下虚拟化回滚滚动稳定性作为正确性门禁。4.4 react-localityReact 重渲染局部性2 个Target决策问题主指标react-rerender-breadth选择/叶子/祖先/源作用域失效的重渲染广度benchmark_secondsreact-runtime-node-fanout根插入/重排/整文档替换是否唤醒无关运行时节点选择器slate_react_runtime_node_fanout_countreact-runtime-node-fanout的门禁设计极具代表性正确性命令直接指向单元测试cd packages/slate-react bun test:vitest test/provider-hooks-contract.tsx -t fan out|full-document replacement晋升条件是基准指标为 0 扇出契约测试通过——性能指标与行为契约绑定缺一不可。4.5 其余家族8 个Target家族决策问题主指标browser-rich-text-replay-coveragebrowser-rich-text富文本/表格/内联/paste-html 夹具在 v2 与 legacy 上的重放覆盖replay_secondsclipboard-large-payloadclipboard10000 行复制粘贴与 50000 块双节点剪切是否在 issue 形状预算内clipboard_secondscollab-readinesscollaboration远程重放/书签 rebase/规范替换/history skip/清理通道是否就绪benchmark_secondsissue-6038-transaction-executionissue-replayissue #6038 事务执行重放是否健康benchmark_secondshistory-comparehistory撤销/重做输入与片段历史是否追平 legacyhistory_compare_worst_p95_ratiohistory-retained-memoryhistory历史保留多少内存benchmark_seconds状态missing-optional-artifactreact-active-typing-breakdownreact-typingReact 运行时活跃输入时间花在哪typing_secondsreact-pagination-virtualized-char-burstreact-paginationrows800 虚拟化分页的字符突发输入是否接近 staged 表格性能pagination_virtualized_vs_table_ratio几个值得注意的细节clipboard-large-payload通过环境变量SLATE_CLIPBOARD_BENCH_HUGE_CUT_BLOCKS50000与SLATE_CLIPBOARD_BENCH_ISSUE_TARGETS1指定以 issue 形状为目标的预算history-compare的晋升阈值为history_compare_worst_p95_ratio2.0且bun check绿灯HISTORY_BENCH_LEGACY_REPO../../../slate指定对照仓库react-pagination-virtualized-char-burst的 Playwright 门禁覆盖原生双击选择投影分页词在换行处放置虚拟化分页选区等原生行为防止虚拟化破坏浏览器原生选区语义。五、报告是如何生成的bench-targets.mjs的内部链路报告不是手工维护的而是由 tooling/scripts/bench-targets.mjs 自动生成。理解这条链路才能读懂报告的每个数字来源。相关 npm 脚本定义在根 package.jsonpnpm bench:targets:list # 列出全部 target pnpm bench:targets:check # 校验注册表合法性 pnpm bench:targets:report # 生成历史 JSON Markdown 报告 pnpm bench:targets:report:check # 校验生成文件是否过期 pnpm bench:targets:report:dry-run # 只计算不落盘 pnpm bench:targets:dry-run -- react-active-typing-breakdown # 只读演练 Autoresearch 计划 pnpm bench:targets:run -- react-active-typing-breakdown # 真实运行某个 target5.1 校验check与validateRegistrycheck命令调用validateRegistry见 bench-targets.mjs其规则包括version必须是 1targets必须是非空数组每个 target 必须具有id/question/owner/family/cwd/command六个必填字段target id 不能重复cwd与artifacts[].path必须是仓库相对路径path.isAbsolute判定为绝对路径即报错metrics.primary必填metrics.direction只能是lower或highermetrics.printsMetric必须是布尔值correctness.command必填artifacts必须是非空数组且每个元素必须有path。校验通过时输出benchmark-targets ok: N targets。这套校验确保了注册表本身的结构健康是后续一切命令的前提。5.2 状态机artifact 存在性 → target statusbuildTargetHistory见 bench-targets.mjs对每个 target 的 artifacts 逐文件做fs.existsSync检查然后按优先级计算状态missing-required-artifact有必需产物缺失 missing-optional-artifact仅可选产物缺失 ok全部产物存在这正是报告中ok25, missing-optional-artifact2两个状态值的来源。同时countArtifacts汇总全局计数27 个产物、25 个必需、25 个已存在、2 个缺失可选、0 个缺失必需。5.3 渲染renderMarkdownReportrenderMarkdownReport见 bench-targets.mjs把 target 列表渲染为 Markdown 表格其中Artifacts 列 已存在产物数/产物总数如1/1Metric output 列target.printsMetric ? yes : wrapped即对应metrics.printsMetric布尔值表格单元格通过escapeMarkdownCell转义管道符避免 id 中含|破坏表格。5.4 生成物与过期校验pnpm bench:targets:report一次写入两个文件benchmarks/targets/history/slate-v2-latest.json——完整的历史模型含每个 artifact 的exists状态与 countsbenchmarks/targets/reports/slate-v2.md——Markdown 摘要报告。report:check则用assertFileEquals把磁盘上的两个文件与实时计算内容逐字节比对不一致即报 generated file is stale防止提交了过期报告。report:dry-run只打印统计不落盘。5.5 运行run与 Autoresearch 接线run target-id读取注册表解析出仓库相对cwd用spawnSync以 shell 方式执行command。而dry-run/autoresearch-init/autoresearch-setup-plan会调用外部autoresearch.mjs脚本并传递一组参数见autoresearchSetupArgs--cwd指向.tmp/slate-v2--name为 target id--metric-name/--metric-unit/--direction来自metrics--benchmark-command为cd 绝对cwd command--benchmark-prints-metric为metrics.printsMetric--checks-command为correctness.command。这意味着 Autoresearch 会话完全由注册表驱动改一次注册表所有下游运行、解析、正确性检查自动跟随无需改代码。六、如何把这个体系用起来操作路径与决策流6.1 日常查看先 list 再 reportpnpm bench:targets:list # 看全部 target 的 id/family/metric/command pnpm bench:targets:report # 刷新最新状态报告 pnpm bench:targets:report:check # 提交前校验报告未过期list输出为制表符分隔的四列id、family、主指标、命令适合 grep 过滤。6.2 优化某个 targetdry-run 先行pnpm bench:targets:dry-run -- react-active-typing-breakdowndry-run是只读操作README 明确标注它校验注册表、构建报告模型、并请求 Autoresearch 输出针对该 target 的 setup 计划JSON同时打印autoresearchSetupOk与benchmarkMode等诊断信息。它不会创建任何.tmp/slate-v2/autoresearch.*会话文件——只有当你确定要开始真实优化循环时才使用node tooling/scripts/bench-targets.mjs autoresearch-init target-id创建/替换会话文件。日常操作流程建议调用slate-ar*相关 skill 而非直接使用包脚本。6.3 晋升决策性能指标 正确性双门禁从各 target 的thresholds可以看出统一的决策模式只看 p95 类主指标不追求平均值每个性能晋升都必须配bun check或指定 Playwright 用例绿灯。典型判定模板主指标达到 promotion 阈值如比率 ≤1.5、p95 75ms正确性命令通过bun check或 target 专属测试连续 2 个正确性通过的重复包且增益 5%判定进入平台期并停止循环。6.4 迁移操作import-evidence-kitpnpm bench:targets:import-evidence-kit该命令从benchmarks/editor/research/benchmark-registry.json读取旧的 Evidence Kit 产物列表通过targetFromEvidenceKitArtifact转换成新的 target 结构并写入注册表注意不加--write时只打印 JSON 不落盘。指标名由metricNameFor按 family/kind 自动推导react-typing→typing_seconds、browser-trace→browser_trace_seconds、core-*→core_benchmark_seconds、browser-rich-text→replay_seconds、clipboard→clipboard_seconds其余回退为benchmark_seconds。迁移期之后target 定义直接在benchmarks/targets/slate-v2.json中编辑即可无需再走导入。七、阅读报告时的高频问题速查Q1为什么两个 target 显示missing-optional-artifact而报告不算失败因为这两个产物core-transaction-current与history-retained-memory在注册表中标记为required: false。状态判定优先级是必需缺失 可选缺失 ok只有必需产物缺失才会计入missing-required-artifact并触发失败语义。Q2Metric output列的yes和wrapped有什么区别yes表示 target 原生打印METRIC namevalue行Autoresearch 可以直接抓取wrapped表示尚未打印原生 METRIC 行Autoresearch 需用计时包装兜底。注册表在metrics.upgrade中建议Prefer benchmark-native METRIC lines when this target is touched——即优化这些 target 时优先给 benchmark 加上原生 METRIC 输出。Q3为什么同样的大文档有 6 个 target因为大文档性能被拆成了正交的决策维度full聚合套件总账、legacy-compare对 legacy 的胜负、browser-traceChromium 侧 DOM/堆/长帧、slate-browser-tracelegacy 对照 trace、virtualized-type-to-paint虚拟化表面交互延迟、overlaysoverlay/部分 DOM 提升路径。每个 target 各回答一个具体问题避免一个数字掩盖多个问题。Q4报告的权威性来自哪里来自注册表治理。报告声明自己是benchmarks/targets/slate-v2.json的生成产物而注册表又由validateRegistry强制约束字段与路径规则。文档与研究文件如docs/plans/下的计划、benchmarks/editor/research/evidence-source-map.md只是链接证据不参与控制状态——这条边界写死在注册表policy.docs中。八、延伸阅读benchmarks/targets/README.md——target 注册表的完整操作手册命令、契约、生成物说明benchmarks/targets/slate-v2.json——27 个 target 的完整主数据含全部 question、command、thresholds、migration 溯源benchmarks/targets/history/slate-v2-latest.json——报告对应的历史模型含每个 artifact 的exists布尔状态tooling/scripts/bench-targets.mjs——报告生成、注册表校验、target 运行与 Autoresearch 接线的全部逻辑benchmarks/editor/iterations/003-evidence-control-plane.md——“未注册的旧 benchmark JSON 不算活跃证据”这一治理规则的出处package.json——bench:targets:*系列 npm 脚本的完整清单。综上benchmarks/targets/reports/slate-v2.md这份看似简单的表格报告背后是一套注册表驱动的基准测试治理体系它以 27 个决策问题为单位组织测量用 artifacts 存在性自动评估健康度用 thresholds 定义晋升/拉伸/平台期用 correctness 门禁锁死行为回归并通过bench-targets.mjs把报告、运行与 Autoresearch 全部串成一条可审计、可复现的链路。理解这套体系就能读懂 Slate v2 性能工作的任何一份状态快照并直接上手优化其中的任意 target。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表