Notist
On this page
  1. 求值器局部简化与同批验证
  2. 结论
  3. 实施范围
  4. 比较对象与口径
  5. 普通 CLI 结果
  6. 输出未变,5 轮
  7. 强制整站替换,3 轮
  8. 无旧输出,3 轮
  9. 波动与 CPU 时间
  10. 语义与回归验收
  11. 保留的边界与证据

求值器局部简化与同批验证

结论

三项局部简化均保留。本批 15 个负载/发布状态组合没有中位数回退,宽导出改善最明确;这不等于所有输入或每次运行都保证更快。

  • 宽导出:same 加速 1.175×,耗时减少 14.9%;replace 为 1.143×,first 为 1.091×。

  • 无模块正文为 1.056–1.067×,共享图为 1.060–1.100×;各自正式配对样本中 after 均更快,但样本量小,不主张统计显著性。

  • 私有图为 1.008–1.046×,仍属小幅变化,不能据此宣称私有模块编译或缓存持有问题已经解决。

  • XIV 为 1.013–1.026×,范围明显重叠,按基本持平处理;尤其 first 的三组配对只有一组 after 更快,不能只看中位数之比宣称稳定收益。

  • 145 次完整构建,累计核对 1,561,360 个文件指纹、1,560,867 份 HTML,全部与原完整清单一致。这些是多轮验收总数,不是唯一页面数。

实施范围

本轮在上一轮未提交优化补丁上继续做三项局部简化,生产增量只涉及 crates/notist-pipeline/src/code/check.rs 与 eval.rs:

  1. 只读函数体借用:实例检查直接借用 Context 中的 CodeBody,不再复制未检查的 Expr;诊断仍按所属结果复制。不增加 Arc 层。

  2. 单节点返回单节点:present_node/present_call 返回 Item,bind_content 逐项 push,不再通过单元素 Vec 传递这些局部结果。森林与 Runtime Content 的表示保持原样;execute 的挂载边界容器并未全部消除。

  3. 递归返回摘要:bind_content 返回森林及正常节点数;present/repeat 返回森林及 ContentSummary,present_node/present_call 返回节点及摘要。父层合并计数,repeat 通过 failed 判断失败,不重新扫描已构造子树。

ContentSummary 只有 nodes 与 failed,是当前返回值的局部信息,不写入 Item,不是持久缓存。显式共享内容插值处仍保留一次 content_count;没有为了消灭这次扫描而扩大 Runtime::Content。

绑定与呈现不合并,保留 Analysis 不变、重复挂载隔离、延迟内容、扩展执行目标、来源与诊断、恢复节点、逻辑读取顺序、累计额度、依赖及 NeedResources。没有新增缓存、实例 ID、spool、调度器或 allocator 替换。

比较对象与口径

本轮的 before 不是原始提交,而是 214de5fec5ea796a047024510566168e1fa81d08 加上一轮生产补丁:

  • before 补丁 SHA-256:1998c01a1b9279bb4c00ca7ada382ede1ec39b82cf3f771dc15b0f8446651cd2。

  • after 补丁 SHA-256:b563e340b2f4438a79bd32165cd587f57c68cd527bb1b28ee4f937419e799a74。

  • 普通 before CLI SHA-256:1b5bf5f04ed2fa699de10f966c6cbf03054f727d682bb26ec28048cef17e6480。

  • 普通 after CLI SHA-256:f9ddaf263844f5c87666e3548d8ccf1295cec3b592831a0aee3bb5ce5a252d73。

两侧普通 release 在本批重新计时,不复用上一轮秒数,也不将上一轮相对原始提交的收益重复算作本轮增量。普通 after 构建日志记录了七个工作区 crate 的实际重编译。Rust 为 1.97.1,依赖锁未变化。

保留完整真实 XIV DB、全部页面与正文,以及四种完整正文/模块负载。消费者、页面枚举模型、site.data 和输入预算均未改变。普通 CLI 固定 CPU 8,每次新进程、各自预热、前后顺序交错;频率未锁定,不主张统计显著性。编译、测试及语义差分先完成,再进行普通计时。

  • same:旧输出完全一致,正式测量每侧五轮。

  • replace:计时外只篡改本工具自己的旧 index.html,正式测量每侧三轮;暂存、整站替换和同步清旧均在计时内。这是发布路径控制,不是任意源编辑的增量成本。

  • first:计时外移除本工具自己的旧输出,正式测量每侧三轮;不包含清旧成本,单独比较。

每种负载/状态/二进制另有一次预热,另先做五次 seed,共 145 次完整构建。逐文件验收在每个子进程退出后进行,不计入 CLI wall。普通、插桩与多核不混算;本轮不新增插桩或多核计时。

普通 CLI 结果

单位为秒,加速比为本批 before 中位数/after 中位数。

输出未变,5 轮

完整负载

HTML 页

before

after

加速比

XIV

51,739

3.147694

3.105787

1.013×

无模块正文

521

0.282752

0.267712

1.056×

共享模块图

521

0.233223

0.220119

1.060×

私有模块图

521

0.807427

0.771602

1.046×

宽导出

521

0.376312

0.320323

1.175×

强制整站替换,3 轮

完整负载

before

after

加速比

XIV

4.148312

4.042596

1.026×

无模块正文

0.294860

0.276412

1.067×

共享模块图

0.245067

0.223315

1.097×

私有模块图

0.790467

0.783834

1.008×

宽导出

0.365187

0.319510

1.143×

无旧输出,3 轮

完整负载

before

after

加速比

XIV

3.447706

3.372281

1.022×

无模块正文

0.278040

0.263340

1.056×

共享模块图

0.231804

0.210697

1.100×

私有模块图

0.780289

0.762059

1.024×

宽导出

0.354572

0.325052

1.091×

波动与 CPU 时间

XIV 的 same 范围为 before 3.090550–3.205989 s、after 3.030008–3.168762 s;replace 为 before 3.877595–4.379427 s、after 3.832162–4.388356 s;first 为 before 3.099923–3.716242 s、after 3.261430–4.477370 s。first 的 after 慢样本保留,预热中的 replace 5.2111 s 和 first 4.2870 s 也保留,不因其较慢而改变既定预热规则。

私有图 same 的 before 范围为 0.744797–0.810608 s、after 为 0.764268–0.808053 s,五组配对仅三组 after 更快;宽导出 same 的两侧范围分别为 0.351844–0.384331 s、0.314349–0.323010 s,五组配对 after 均更快。不能将小幅/不一致变化与宽导出的改善等量解读。

same 的 user/system 中位数如下;二者分别取中位数,不要求相加等于 wall 中位数。

完整负载

前 user

后 user

前 system

后 system

XIV

2.752551

2.757717

0.383941

0.367003

无模块正文

0.258456

0.243029

0.025908

0.029939

共享模块图

0.203565

0.197276

0.027937

0.019872

私有模块图

0.702657

0.689826

0.097934

0.084478

宽导出

0.329042

0.284227

0.043822

0.034754

完整 wall/user/system 的 min、max、median 及逐次样本保留在 summary.json 与 samples.json。计时前后重新核对源码、输入、二进制与生产补丁指纹,均未变化;结果汇总另按样本重算,并逐项复核全部输出验收清单。

语义与回归验收

  • 工作区 all-features 串行测试:735 项通过。

  • 顶层 no-default-features 串行测试:370 项通过,与前项有重叠,不相加。

  • Python 工具测试:27 项通过;旧探针仅维护返回形状/借用实现的兼容,没有新增仓库内性能框架。

  • Clippy 通过,保留 context.rs 的 bool::then/filter_map 与 profiling.rs 的 thread_local const 两条既有警告。

  • 两处生产 Rust 的 rustfmt 检查及 git diff --check 通过;更新后项目文档构建成功,共 51 页,输出位于 /tmp/opencode/notist-simplify-docs-20261103/,不计入性能样本。

  • 新增一项递归摘要回归,内部覆盖 640 组:两种前端、五类内容程序、64 组额度。核对绑定计数、呈现计数/失败标记与实际树一致,覆盖重复挂载、空内容、children、循环失败、结构约束、恢复节点带残留 children、单根及 Analysis 不变。

  • 独立语义差分每侧 5,568 组:12 类程序、两种前端、Pending/失败两种输入状态,以及节点、steps、iterations、call_depth、read_requests、loop_work 额度。对比完整 IR、诊断与来源展开、依赖、NeedResources 和读取顺序,每次确认 Analysis 不变。

最终差分使用全新、独立 Cargo target;before/after 二进制哈希不同,输出逐字节一致,输出 SHA-256 均为 6eb2706a2ceab99da1af12322eaedfa0458f79f4156d05cfac435bb143c20ca9。初次共用 target 的尝试被拒绝:第二侧被错误视为 fresh,二进制哈希相同,不能作为差分证据。无效产物及日志保留为 stale-rejected,并记录纠正原因;最终结论只使用独立重建结果。

保留的边界与证据

本轮没有消除全部边界复制或全部临时容器,也没有测量物理分配量/RSS。源码中删除的重复扫描不等于已重新量出所有逻辑访问次数;普通端到端结果也不能分别归因于三项改动。预留/回填、检查缓存所有权/总预算、轻量 SSG 索引等仍需另行减法审查,不算本轮已完成。

设计描述已同步至 docs/designs/crates.not。上述测量基于提交前冻结的工作区快照,测量过程未提交或推送。

原始证据位于 /tmp/opencode/notist-simplify-profile-20261103/:before.patch、after.patch、simplification.diff、manifest.json、sources、bin、logs、inventories、samples.json、summary.json、integrity.json、semantic-parity.json、parity-correction.json 和语义差分完整输出。measure.py 与 parity.rs 都是该目录内的一次性驱动,不添加仓库内常驻框架。