求值器局部简化与同批验证
结论
三项局部简化均保留。本批 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:
只读函数体借用:实例检查直接借用 Context 中的 CodeBody,不再复制未检查的 Expr;诊断仍按所属结果复制。不增加 Arc 层。
单节点返回单节点:present_node/present_call 返回 Item,bind_content 逐项 push,不再通过单元素 Vec 传递这些局部结果。森林与 Runtime Content 的表示保持原样;execute 的挂载边界容器并未全部消除。
递归返回摘要: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 都是该目录内的一次性驱动,不添加仓库内常驻框架。