# 性能与成本实测(对应任务 ③) > 数据全部来自 `evidence/` 下的 json,不是估算。复跑命令写在每节末尾。 ## 一 · fold 耗时分解 一次 fold 由四段组成,耗时相差三个数量级: | 段 | 耗时 | 依据 | |---|---|---| | 增量范围选择(`selectIncrementalRange`) | **0.01 ms** | `bench-2000.json` → `ms.selectRange` | | 渲染硬事实块(`renderFacts`) | **1.1 ms** | `bench-2000.json` → `ms.renderFacts`(2000 边 / 1201 失败边 / 81,167 字符) | | **模型生成摘要** | **5–20 秒** | `真实模型多规模测试.json`:A 5,175ms / B 8,337ms / C 8,776ms;`真实端到端测试.json` 15,226ms | | 事务写入(`compactRegion` 内 replace) | 未单独计时 | 单测里整条事务 < 50ms(无模型时) | **结论**:fold 的耗时 99.9% 是模型调用。插件自身逻辑(范围选择 + 事实渲染 + 事务)在 2000 边规模下合计 < 2ms。 **如果要优化 fold 速度,唯一有效的手段是减少模型调用次数** —— 这正是 `growthFloorTokens`(增长门)的作用:刚压完立刻再调会被拦住(`evidence/fold触发验证.md` ③)。 ```bash node test/bench.mjs 2000 node test/real-model-scenarios.mjs ``` ## 二 · graph 体积 | 规模 | graph.json | 说明 | |---|---|---| | 2000 边 / 2001 节点 | **1.41 MB** | `bench-2000.json` → `jsonBytes: 1,477,526` | 线性外推: | 边数 | 预估体积 | |---|---| | 1,000 | ~0.7 MB | | 5,000 | ~3.5 MB | | 10,000 | ~7 MB | 每次 flush 写入 1.41 MB(同步 + rename 原子写)。2000 边时序列化 **3.505 ms**(`bench-2000.json` → `ms.serialize`)。 落盘频率:变化后 **1.2 秒 debounce**(同一会话的多次变化合并);`graph.md` 只在 idle / fold 后渲染。 ## 三 · ledger 渲染 | 指标 | 值 | 依据 | |---|---|---| | 渲染耗时(2000 边) | **0.478 ms** | `bench-2000.json` → `ms.renderLedger`(v1.3.x 是 4.9 ms;本轮 0.478 ms:手割只算一次 + 跳过注定装不下的档位) | | 输出 tokens(预算 500) | **323 tokens**(L5 降级;v1.2.x 时 476,v1.3.1 起短标签,**v1.4.0 起每条边都带报错原文**) | `bench-2000.json` → `ledgerTokens` | | 失败边总数 | 1201 | `bench-2000.json` → `failures` | | 预算内省略 | 1191 条进汇总行 | `bench-2000.json` → `ledgerOmitted` | | 真实会话(2443 事件) | **349 tokens**(L3) | `evidence/重启验证.json` → `v012.ledgerTokens` | | 真实分词校验 | 1219 字符 → **486 prompt tokens** | `evidence/真实模型测试.json`(网关 usage 反推) | | 全库 45 个真实会话(同语料新旧对比) | tokens **19,437 → 20,714(+6.6%)**,带原因的失败边 **87 → 207(2.4×)** | `evidence/热清单标记AB实验.md` §3 | **降级链**(L0→L5):全量 → 原因截短 → 只留意图 → id+22字 → 最近20条 → 最近10条。 **每一档都保留「报错原文」与「总条数 / 省略范围」汇总行**(v1.4.0 起不再整段砍掉原因 —— 实测全库 只有 25/133 条可见失败边带原因,而模型判断「是不是同一个坑」靠的正是报错原文)。 装不下的档位会被**预判跳过**(按每行下界 × 条数),不再白渲染 1201 行。 ## 四 · 真实 token 曲线 ### 4.1 一次 fold 的 token 收支(模拟,`evidence/模拟结果.json`) | 场景 | 折叠次数 | 摘要成本 | 计费总量 | 峰值上下文 | |---|---|---|---|---| | 200K 窗口 / 200 步 | 见 json | 16.1M / 17.5M / 23.4M | 185M / 189M / 283M | — | | 1M 窗口 / 600 步 | — | 18.4M / 22.5M / 27.9M | — | — | | **节省(平均上下文)** | | | **26.96% / 33.66% / 22.7%** | | | **节省(峰值上下文)** | | | | **37.7% – 43.2%** | ### 4.2 热上下文的真实占比(实测) | 会话 | 热上下文 tokens | 上下文窗口 | 占比 | |---|---|---|---| | 真实会话(2443 事件) | 349 | 200K(假设) | **0.17%** | | 压力测试(2000 边) | 476 | 200K | 0.24% | 即:**棋谱把「每一步都重读全部历史」换成「每步只读 ~350 字的索引」**,这是它省 token 的根本机制。 ### 4.3 摘要本身的成本 | 场景 | 摘要字符 | tokens | 耗时 | |---|---|---|---| | 5 条失败边 | 1,418 | 1,201 | 5.2s | | 15 条失败边 | 3,111 | 2,647 | 8.3s | | 30 条失败边 | 4,439 | 3,766 | 8.8s | | 真实端到端(4 步调试) | 782 | 2,624 | 15.2s | **注意**:30 条失败边的摘要 4,439 字符 ≈ 1,480 tokens(中文),一次 fold 的摘要成本约 **1.5K tokens**。相比它省下的历史(动辄几十万 token),值得。 ## 五 · 三个还没量准的数 | 项 | 为什么没量 | |---|---| | **真实计费口径的节省** | 只有模拟(`模拟结果.md`);真实账单要等重启后跑长会话才能核对 | | **fold 的事务写入耗时** | `real-fold.mjs` 只测通不测时;要单独插桩 | | **跨进程并发** | 单进程内 flush 是同步+rename 原子;多实例未验证 | ## 复跑命令 ```bash node test/bench.mjs 2000 # 渲染/序列化/范围选择 node test/evidence.mjs # 重算模拟结果 node test/real-model-scenarios.mjs # 真实模型多规模(含耗时) node test/replay-verify.mjs # 真实日志回放(含真实 tokens) ```