native 直接发射后的求值图
测量对象
本图比较 01649b4 与仅包含 native 直接发射的提交 3089d1f0239850a1c6454ea94b9169de8f4328c1。没有混入 d89fb08 的出版系统重构;开始测量时 HEAD 为 49a643a,但工作区未提交的 eval.rs 改动移除了直接发射路径,所以本图明确不代表该未提交工作区。没有更改或覆盖这些未提交改动。
使用相同 51,739 页冻结站点、独立输入和输出目录;28 次完整构建,78,004 项产物、451,812,631 字节逐次长度与 SHA-256 全部一致。普通 native 二进制来自已有冻结实验,先核对摘要,再将全部 Rust/Cargo 文件与提交归档逐字节核对。新的 frame-pointer 与计数诊断版本分别使用独立 Cargo target 构建,jobs=2。
已消除的工作
两次计数运行完全一致。实际函数调用、表达式数量和最终节点数均保持不变。
操作 | 发射前 | native 直接发射后 |
|---|---|---|
Content::one | 4,065,251 | 513 |
present 调用 | 8,440,426 | 4,375,688 |
Element 计划分支 | 4,219,447 | 154,709 |
native 直接发射 | 0 | 4,064,738 |
最终节点 | 4,219,447 | 4,219,447 |
函数调用 | 6,073,286 | 6,073,286 |
前两项各减少 4,064,738 次,与 native 直接发射的次数相等。Code 和其他真正需要第一类 Content 值的路径仍保留可复用计划,不能将上述下降解释为跳过执行或缓存挂载结果。
同一站点路径、同一包装器、新旧 frame-pointer 二进制的成功 API 对照:
API | 发射前 | 发射后 |
|---|---|---|
malloc | 102,965,311 | 90,925,806 |
realloc | 10,287,923 | 10,287,923 |
calloc | 37 | 37 |
malloc 减少 12,039,505 次,约 11.69%。与旧证据的个别 API 总数不同,因此这里另跑相同当前站点路径的基线,避免将路径长度引起的扩容差异混入效果。两侧记录丢失均为 0。API 次数不是存活对象数,峰值 RSS 仍约 2.71 GiB。
更新后的求值 CPU 图数据
两侧各六次 499 Hz 用户空间栈采样,仅统计文档 run 内的样本;旧侧 7,978 个,新侧 7,914 个。继续采用最内层 Evaluator 方法互斥归因:新 execute_inner 与 execute 合并,新 present_element 与 present/present_call/present_piece 合并。旧分析中的源码行号区域不适用于新实现,未据旧行号生成 native 分段结论。
互斥职责,占求值 CPU | 发射前 | 发射后 |
|---|---|---|
调用执行本地工作 | 37.5% | 39.7% |
挂载与发射本地工作 | 24.4% | 20.8% |
内容绑定 | 7.8% | 7.9% |
表达式本地工作 | 6.9% | 7.0% |
已有实现查询 | 6.7% | 7.9% |
数据读取与 native 数据操作 | 8.4% | 8.9% |
入口、校验和收尾 | 5.6% | 5.1% |
其他 | 2.7% | 2.6% |
互斥叶子操作,占求值 CPU | 发射前 | 发射后 |
|---|---|---|
分配器自身 | 28.8% | 30.1% |
drop/引用计数释放自身 | 13.5% | 11.4% |
clone 自身 | 11.2% | 10.9% |
memcpy/memmove 自身 | 2.3% | 2.1% |
其他执行位置 | 44.3% | 45.6% |
表内各类别互斥,两张表不能相加。占比是相对于各自求值总 CPU,不是绝对耗时变化率;整体变快后剩余职责的占比可以增加。不能据 allocator 占比增加说分配优化失败,也不能据 implementation 占比变化断言实现查询发生回归。
native 的六次 CPU 采样中,前五次整站 wall 为 7.49~7.55 秒,最后一次为 12.64 秒,user/system CPU 也较高。所有六次保留在主图。采样折算求值 CPU 全六次约 2.643 秒/构建,前五次敏感性视图约 2.540 秒;前五次不是用于替代主图的事后筛选结果。旧侧约 2.665 秒,但两侧 CPU 采样不是交错实验,不据这些差值计算精确 native 求值加速比例。
时间参考与限制
计数关闭、只保留边界计时的三次 native 诊断运行,run.total 为 2.541/2.550/2.565 秒,中位数 2.550 秒。其中 run.present 中位数 2.393 秒,来源视图与校验约 0.118 秒;首次绑定和 Evaluator 初始化合计约 0.014 秒。旧诊断 run 中位数为 2.749 秒。可将其作为前后过程参考,但这是非交错、带探针的测量,不声称它就是 native 的精确求值收益。
本轮五组普通 release 交错 A/B 均更快,配对 wall 变化为 -0.71%、-13.63%、-5.55%、-2.97%、-1.78%,中位数 -2.97%。两组 wall 中位数为 7.819/7.446 秒;简单相除与配对统计不是一个量。有明显机器波动,全部保留,因此不承诺固定百分比;已有独立 native 实验的五对中位数为 -2.53%,方向一致。计数关闭探针控制也有明显波动,不据诊断版本偶尔更快宣称探针无开销。
现在的路径与剩余问题
立即挂载 native 构造的通路为:
present_call
→ execute_inner:实参、字段、实现查询和校验
→ Execution::Element
→ present_element:子内容、结构校验、来源链
→ 写入调用者 out
原先 Content::one 的单元素计划及其外层 present/临时节点 Vec 已省去。子内容仍需求值与发射;通用实参字段、共享 children、实例元数据、数据 API 及对象生命周期仍有成本。因此原图中这条中间计划往返不再是待修问题,剩余优化应聚焦参数/字段装配、空子内容以及共享容器的构造与销毁。当前剩余 present 输入中,空片段约 49.4%,单元素约 29.5%;比例变化主要因为 native 的 406 万个单元素包装已被去掉,不能继续沿用旧图的 89.0%。
证据与复现
证据目录:/tmp/opencode/notist-native-chart-3089d1f-20261109。run.py 冻结并验证 native-only 源码、运行控制/交错对照/计数/CPU;analyze.py 合并新旧职责、保留全部样本并生成 native-focus-summary.json。evidence 内保留 manifest、原始 .prof、inline 符号、完整日志、计数、普通 A/B、分配记录、汇总和输出摘要。另一次同路径基线分配诊断保存在 baseline-allocation-sample.json 及对应原始记录中。本轮仅更新分析与图,没有修改生产实现,也没有重跑所有 Rust 功能回归;不外推为未提交工作区、serve 编辑或其他站点的结果。