Notist
On this page
  1. 12:00 截止性能实验(2026-11-05)
  2. 协议与冻结
  3. 实例身份共享
  4. 已渲染语义树生命周期
  5. 阶段证据和预实验
  6. 来源展开链共享
  7. 最终验收
  8. serve 依赖问题与测量夹具失败

12:00 截止性能实验(2026-11-05)

本轮起点是 main 的完整未提交工作区,不是干净 HEAD。四批既有优化和其它已有工作全部保留,其收益不计入本轮。约定截止北京时间 2026-11-05 12:00;停止不是达标,也不自动延期。完整输入、源码、原始日志和测量二进制归档在 /tmp/opencode/notist-deadline-20261105/。

协议与冻结

  • 启动核对时间 10:59:00 +08:00;冻结 466 个源码/工具/文档文件及 79,362 个消费者输入文件。输入逐文件匹配上一批完整指纹,不更改生产消费者、字段、资产、依赖锁或逻辑额度。

  • baseline 可执行文件来自上一批已冻结的 after;本轮逐一复核所有 Rust、Cargo.toml、Cargo.lock 内容一致。baseline 已包含原有四批修改。新候选均提前编译为普通 default-feature release;release debug=1 只保留调试信息,不启用 profiling feature 或观察器。

  • 主测量每次删除上轮实验输出,再启动新 CLI 进程;无应用结果缓存预热。删除旧实验输出是使下一轮满足空输出的夹具复位,不是把 CLI 的发布清理移出计时。文件系统暖缓存允许且固定,不主动清空系统缓存。

  • Python 驱动以 Popen 前至 wait4 返回计 wall,包含同步扩展子进程、组装、发布、析构和退出。输出哈希核对和编译在测量之外。每次必须匹配完整 78,004 文件 SHA-256,包括全部 51,739 HTML 页。

  • RSS 使用 Linux wait4 的 ru_maxrss × 1024:内核高水位,不是稀疏采样。该值对已等待子进程取保守高水位,不能当成各进程同时内存之和。Rust 阶段 VmRSS 已超过数 GB,外部 Python 并非这条内存瓶颈的替代归因。300MB 阈值严格为 300,000,000 字节。

  • 只报告同批对照;预实验、verbose 阶段诊断、历史数据和正式六轮不混合,不相加不同批次的加速百分比。系统 CPU 频率和其它任务未完全隔离,保存亲和性、负载、faults、环境与全部样本。

实例身份共享

Item.instance 和 Item.target 使用既有 Shared,保持完整函数身份、comptime 参数、target 与语义身份的区分。clone 分享不可变身份;通过 DerefMut 修改时 COW 分离。不缓存求值结果、不合并挂载、不用地址判断语言身份,不修改预算计数。

Rust API 迁移(wire 和 Debug 值不变):

item.instance = Some(instance.into());
item.target = Some(target.into());
let borrowed: Option<&FunctionInstance> = item.instance.as_deref();
let owned: Option<FunctionInstance> = item.instance.as_deref().cloned();
// 如需修改,COW 保证其它节点的身份不变。
item.instance.as_mut().unwrap().function.name = "other".into();

新增实例/target 共享与独立修改、独立 children 挂载、完整 wire 往返回归。手写 JSON 边界只借用解引用,不强制启用 core serde。

已渲染语义树生命周期

阶段诊断发现完整树在模板阶段仍保留。DocumentIndex 现在只拥有链接目标的 route 与完整 anchors 投影,不借用目标语义树;按原文档顺序渲染后即可释放该页的完整树/来源,移动 Page 而不是复制它。全部文档仍先完成分析与求值,资源和扩展执行顺序不变;链接处理、错误顺序、来源路径优先级和目录别名优先级不变。未提前发布或遗漏权威树/挂载边界。

新增索引在文档释放后仍保持直接来源、歧义别名的来源排序、目录 index 和 anchors 的回归。

阶段证据和预实验

新起点两次空输出发现样本 wall 为 15.4172 / 15.4888s,内核 RSS 为 6,163,390,464 / 6,160,642,048 字节。它们仅用于定位,不代替正式对照。

实例共享两轮筛选:基线 15.0798 / 13.5965s,候选 12.3226 / 12.1233s;候选 RSS 约 5.709GB。生命周期两轮筛选:instance 12.2138 / 12.1633s,lifetime 10.9778 / 11.0085s;lifetime RSS 约 5.353GB。均核对完整输出。不能相加这两批收益。

普通二进制 verbose 独立诊断显示 instance 求值结束 VmRSS 约 4.7GB,模板阶段约 5.7GB;该诊断含日志观察成本,不参与加速统计。产物总字节 451,812,631(其中 HTML 118,097,122):当前同时拥有全部输出 Vec 的接口,仅输出内容本身即超过 300MB。达到目标需要进一步、经验证的生命周期/发布架构改变,不是通过改口径或丢弃数据达成。

来源展开链共享

基于仍存活的大量语义节点和来源追加证据,另在外部冻结副本实验 SourceChain:空链无分配,非空链共享 Vec;修改经 COW 分离。一次 expand 遍历中,对同一旧链复用“追加完整 locations 后”的新链,仍逐节点保留独立 Origin、source、start、end,展开顺序与重复项不变。旧链在局部表中同时保留,避免释放后地址重用;地址仅用于不可变存储复用,不作语言身份或值相等判断。该局部表不跨 expand、更不跨文档/构建缓存结果。

外部两轮筛选:lifetime 11.1392 / 11.0252s,chain 10.8677 / 10.6316s;chain 内核 RSS 4,843,184,128 / 4,842,401,792 字节,完整输出一致。筛选成功后才将实现带回工作区,增加空链与 clear 后空链的值相等、完整跨度、COW、共享/不同旧链追加、来源顺序及独立挂载回归,并重新构建最终版本。

Rust API 的 Origin.expansion 从 Vec 改为 notist_core::source_chain::SourceChain:构造时 vec![location].into(),空链 Default::default();借用读取和 Vec 风格 COW 修改继续通过 Deref/DerefMut,取得拥有 Vec 用 let locations: Vec<_> = origin.expansion.into();。wire 仍是完整 JSON 数组,Debug 仍显示普通列表;序列化直接借用切片,不为输出先复制一条链。空链的不同物理表示按值相等。

最终验收

最终 verified 修订已通过默认 746 项、全特性 755 项(均 74 个 test target)、根库/core/pipeline 无默认特性 507 项(50 个 test target),零警告。包含 CLI 的 5 项 LSP 功能回归及外部依赖、失败恢复、隐藏数据编辑/删除恢复的 serve 回归。既有 1,792 组 checkpoint 差分继续通过。另逐字节复核 baseline/verified 错误修订的完整 SSE 诊断 detail 串与冷构建 stderr 完全相同,不只比较消息子串。

截止结论:未达标,不延期。 11:59:30 启动保护拒绝继续启动构建,11:59:55 监督器确认没有测量进程仍在运行;12:00 后仅整理交付记录,没有继续实验。

最终同版本 verified 的最后一批只完成 2 / 6 个必需样本:11.1778 / 12.1403s,中位数 11.659036s;内核峰值 RSS 为 4,841,259,008 / 4,841,357,312 字节。同批 baseline 三次中位数 12.695543s,最大 RSS 6,163,771,392 字节。不能把两次候选当作六次通过,也不能用前一版本的六次补齐。两次实际样本相对目标仍慢 8.659036s,最大内存超出 4,541,357,312 字节;这不是最终六样本验收结果。

前一中间版本(尚无隐藏输入 watcher 修复)的独立完整六轮,baseline / lifetime / final 中位数分别 12.151757 / 10.819603 / 10.600145s,final 六次最大 RSS 4,843,081,728 字节;完整三臂各六次样本保留在 final-samples.json。它证明该版所有权优化的实测效果,但不替代最终 verified 版本的验收,不与其它批次累加收益。

所有已完成主测量输出均逐文件匹配 78,004 个 SHA-256;最终 before/verified 的四组完整 analysis/evaluation JSON 一致。语义验证范围是这些完整 JSON、既有测试及 checkpoint 差分,并非额外导出了 51,739 页的全部内部树。依赖验证覆盖真实模块和隐藏数据编辑及既有外部输入回归,未导出完整 observed 集合逐项比较。最终静态资产编辑步骤、同一长进程完整九步序列、最终候选剩余四次以及更多配对样本均未完成,保留为验收差距,不宣称全面无回退。

交付指纹确认当前全部 Rust/Cargo 配置/依赖锁与 verified 冻结源码一致;普通默认特性 release 测量二进制为归档 bin/verified,SHA-256 为 49ffdb8d5266baacb064dd7242dab98e27068c587e908fefc3902f55426e4852。不要把全特性测试留下的 target/release/notist 混当成该普通测量二进制。汇总见归档 delivery-summary.json、regression-audit.json;原始样本、失败夹具、超时部分样本、源码、输入、所有二进制与迁移说明全部保留。未提交、未推送,未丢弃初始工作区改动。

serve 依赖问题与测量夹具失败

真实编辑准备阶段复现既有问题:被 read_text/read_json 实际读取的 content/.data/ 文件位于隐藏目录,旧 watcher 的隐藏路径过滤使编辑被忽略。独立小站进程证据 hidden-final.json 为 false,修复后 hidden-verified.json 为 true。修复仅让明确 observed 的输入身份及删除其祖先的事件绕过忽略规则,输出目录排除仍优先;不扩大资源读取授权。新增真实进程编辑/删除/恢复回归。该修复后必须重测最终普通二进制,前一组六轮仍保留为中间批,不冒充最终同版本。

HTTP 全量核对工具的两个失败实验全部保留:第一版假设 Content-Length,遇到 tiny-http 的 chunked 响应断言失败;第二版已支持 chunked,但把冷对照的输出父目录放在被观察的项目内,夹具删除/重建 dist 本身触发额外重建,导致取得上一轮事件,整批性能证据作废,不挑取其中较好的数字。修正后冷对照输出改为项目外的独立目录;每次仍为空目录、新进程、同一输入修订,并对全部 HTTP 产物去除且仅去除一个精确的 preview client 注入,再比较完整 SHA-256。两次失败的源码、日志、冷构建诊断和中间样本均保留。

隔离冷输出后的 baseline 序列完成初始、正文编辑、错误、修复、添加、删除、共享模块、数据、资产步骤;隐藏数据修改未触发重建、与冷构建不同,明确记录为基线缺陷,不记为“0ms 加速”。最终 verified 的第一进程完成初始、正文编辑、错误、修复、添加后被实验 400s 总预算终止;另一独立进程从已添加页面状态开始,完成初始、删除、实际修改共享模块正文、隐藏 JSON 数据修改与全量冷对照后,到达 120s 子实验预算。两段不是同一个长生命周期进程,静态资产编辑步骤在最终版本上未完成核对,不宣称整套连续九步已全部验收。每个已完成的成功修订均比较全部 78,004 文件(添加时 78,005),错误步骤比较诊断并保留旧预览;所有部分样本和退出 124 均归档,不因超时丢弃。