Notist
On this page
  1. 求值执行与内容物化重构验收
  2. 范围与结论
  3. 语义与结构
  4. 独立求值 A/B
  5. 整站五组交错 release A/B
  6. 布局与持有内存
  7. 求值范围内 CPU 归因
  8. 证据与复现

求值执行与内容物化重构验收

范围与结论

基线为 b60e8a8,候选代码提交为 76e7563,位于 refactor/eval-execution。checked IR、compiler、wire、直接 embedding、native/data/Code 参数消费与内容发射已成组迁移;不保留第二套解释器或名字回退通路。SSG、Book、HTML、资源授权与身份命名空间未修改。

  • Invocation 受控构造与编辑,在声明位置绑定参数,保留 supplied order、重复条目与额外字段。

  • 临时实参归调用所有;native 按角色借用或消费,Code 按 BindingId 槽位接收。只有 constructor 冻结持久字段 DictBuilder。

  • 唯一 invoke 返回 CallOutcome;立即发射的 ElementDraft 不包装单元素 Content,最终 children 完成后一次构造 Node。

  • Content 使用 Empty/One/Many,共享存储持有逻辑节点计数;空内容零分配,singleton 直接共享,无临时 Vec。Ready 复用具体 payload/children,来源元数据单独持有。

  • 发射追加到最终输出;失败仅回滚相应后缀,保留诊断、资源请求和累计预算。森林仍向每个 piece 传入相同原始限额,循环使用剩余额度。

语义与结构

默认整工作区测试 878 项通过,全特性 888 项通过,无忽略项;编译 jobs=2,test-threads=2。新增实参顺序、optional 捕获重放、重复/额外参数、声明编辑重绑定、非法公开位置查询和异常 embedding 布局诊断测试。

外部程序独立链接两侧生产 rlib,比较 58 个求值场景的完整 root、fields、attrs、instance、origin、diagnostics、dependencies、sources 或 Pending 路径;再比较任意顺序、重复/额外条目的 wire 往返,共 59 项全部一致。没有归一化身份或来源。

结构断言通过:空 Content 构造/clone/drop 零分配;singleton 一次分配;绑定 singleton Ready 无临时 Vec;固定标量实参准备零分配;builder 保持共享键、重复更新、宽字典查询、COW 与逻辑预算。正常输出无 Expr,输入和捕获内容不被改写。

外部异常记录的显式契约:选定声明与实现的 kind/参数位置布局必须一致;不一致时在实参求值后诊断失败,不保留偶然的名字回退行为。不承诺畸形外部 IR 的旧错误文本不变。Rust API 说明位于 crates/notist-eval/README.md,语言与文本 wire 不变。

独立求值 A/B

每侧三个新进程,每进程七轮 shuffled 样本,40ms 目标批次。普通 release 计时包括求值和结果析构,不含编译、夹具准备、HTML、文件 IO 或校验;分配统计来自单独 alloc-metrics 构建。每轮在计时外校验完整结果。

以下为三个进程中位数的中位数,尺寸均为 128;请求 bytes 是累计分配/重分配流量,不是 RSS。

场景

基线 µs

候选 µs

时间变化

分配次数 基线→候选

请求 bytes 基线→候选

native_text

49.096

37.173

-24.3%

1297→527

116104→66944

code_calls

94.944

74.642

-21.4%

2847→1177

320212→195748

many_parameters

37.606

10.911

-71.0%

210→46

58572→30444

capture_uses

52.195

40.002

-23.4%

1312→535

131020→80964

recover_errors

73.080

62.775

-14.1%

2845→1815

196204→136252

strict_lets

8.258

8.088

-2.1%

60→47

21708→21052

json_cached

232.700

175.422

-24.6%

8114→3116

615559→309847

不声称每个控制项都更快:ready_text/1 为 0.341→0.358µs,约 +17ns/+5.0%;ready_text/16 约 +0.3%,ready_text/128 约 +1.9%。这些 Ready 对照项的分配次数从 6 降到 5,请求流量各少 8 bytes;小规模控制项仍有固定分派代价。nested_expansion/16 为 7.351→7.323µs。全部 58 行、进程中位数和原始样本保留在外部 evidence,不剔除不利数据。

整站五组交错 release A/B

冻结的同一份输入,完整发布包含 78,004 个文件、451,812,631 bytes。每次构建后在计时外核对全部路径、长度和 SHA-256,十次全部一致;六次独立 CPU 采样构建也核对相同完整产物。输入清单与源码/二进制摘要检查通过。计时不与本任务编译或测试并行;OS cache、CPU 频率及其他系统负载未控制。

组

基线秒

候选秒

基线峰值 RSS KiB

候选峰值 RSS KiB

1

13.284

7.120

2829560

2757152

2

7.743

7.339

2830284

2756444

3

7.799

7.155

2829720

2756340

4

7.745

7.151

2830260

2757252

5

7.762

7.211

2830728

2756616

不删除首组慢样本。构建中位数 7.762→7.155s,约 -7.8%;进程峰值 RSS 中位数 2830260→2756616 KiB,约 -2.6%。RSS 来自 GNU time,不是请求流量或 evaluator 独占堆。

布局与持有内存

公共 checked 类型

基线 sizeof

候选 sizeof

Invocation

144

144

InstanceRecord

312

336

TypedExpr

136

136

FunctionDef

120

120

ParameterDef

160

152

候选内部布局:Content=16、Piece=152、Runtime=48、Construction=72、ArgumentValues=136 bytes。逻辑计数在共享存储,不为每个 Runtime 槽位增加占用。

分配诊断另外记录 prepared 夹具的持有堆、峰值、output-live 和析构后状态。prepared 测量包含源文本、checked IR、Context、资源与 canonical 快照,不冒称纯 IR 堆大小;静态大小变化不能只凭 runtime 分配下降推断。全部求值场景的结果析构后额外请求存活量,两侧均为 0。完整请求峰值与持有量在 allocation/prepared JSON。

求值范围内 CPU 归因

内核拒绝 perf event 采样,未修改系统权限。使用 gperftools 499Hz 用户 CPU timer、libunwind DWARF 和原始 release 二进制,仅采选定父进程,不采 Python 子进程。每侧三次整站构建;基线求值范围 3972 个样本,候选 3278 个样本。

按最近语义职责互斥归类,不把方法搬家当作热点消失:候选 ArgumentValues 与 invoke 合并,对照基线 execute 的调用装配。下列是每次构建的近似采样 CPU 秒,不是普通 A/B wall time。

互斥职责

基线

候选

调用装配、实参消费及持久字段

0.996

0.784

发射与挂载

0.724

0.451

实现解析

0.191

0.178

表达式执行

0.168

0.221

内容绑定

0.234

0.216

native data 与资源

0.212

0.198

run 校验与清理

0.128

0.143

另一互斥叶操作视图:allocator 约 0.784→0.559s,drop/引用计数约 0.362→0.132s,clone 约 0.283→0.203s,memory copy 约 0.060→0.113s。两种视图不能相加;内联、采样误差和职责移动使单项变化不等于因果证明。

证据与复现

完整 evidence 位于 /tmp/opencode/notist-execution-refactor-b60e8a8/:冻结基线源码、独立普通/分配 target、环境信息、源码及二进制 SHA-256、输入/完整输出清单、default/all-features 测试日志、三进程逐样本 JSON、五组整站日志、完整结果差分、prepared 堆探针、原始 CPU profile 与 inline 符号映射,以及 validate.py、extra-checks.py、cpu.py、report.py、finalize.py。先前布局测量另存 first-pass 与 layout-pass,不充作最终候选结果。

普通回归:CARGO_BUILD_JOBS=2 CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 cargo test --workspace --locked --offline -j2 -- --test-threads=2;全特性增加 --all-features。求值 driver 用 tools/eval-bench,普通计时与 --features alloc-metrics 构建分开。完整站点须使用 evidence 内同一冻结夹具与清单,不以减少页面或绕开发布检查替代。