docs: correct PERF-13 attribution and record architecture review of concurrent changes

Opening a long conversation got faster because of the two-step pane render (09c415b), not the live message store, and its catch-up frame is now a long frame. Records which concurrent changes follow the batch rules, and adds Story Graph search and batched remote event writes to PERF-15/16 and the list-order state to PERF-14.
This commit is contained in:
mesalogo
2026-10-02 21:04:47 +08:00
parent 6ced760c1a
commit 7aad78752b
@@ -668,9 +668,15 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用
| 输入 120 字(有 300 个会话) | 27–81 / 35–227 ms | 10–19 / 12–36 ms |
| 流式 40 KB:Long Tasks 总时长 | 6.5–20.8 s | 3.6–19.3 s(3 轮中 2 轮约 4–5 s) |
| 流式期间输入 | 73–1,808 / 174–3,498 ms | 34–62 / 59–573 ms |
| 打开 2,000 条消息会话 | 1.07–1.80 s | 0.47–0.76 s |
| 打开 2,000 条消息会话(见下方更正) | 1.07–1.80 s,帧 p95 9–42 ms | 0.47–0.76 s,帧 p95 75–1,008 ms |
| 首次 / 缓存命中切换会话 | 持平 | 持平 |
**更正(归因):** “改动后”构建包含了当时工作区中另一项未提交的改动——新会话面板分两步
渲染(先最后 20 条,首帧后补齐 80 条,后提交为 `09c415b`)。打开长会话的耗时下降主要来自
它,而不是流式缓冲;同时补齐那一帧变成长帧,4× 降速下该场景帧间隔 p95 从 9–42 ms 升到
75–1,008 ms。输入与流式期间输入的改善来自本步骤。分两步渲染只是过渡,补齐帧的成本需由
`PERF-14` 虚拟化解决。
不降速时(2 轮)各场景持平或略好,流式期间输入 p95 从 15–17 ms 降到 11–12 ms。流式本身在
4× 降速下仍每帧掉帧:剩余成本是行内 Markdown 解析与 KaTeX 渲染,以及每 250 ms 一次的 App
级吸收;切换会话的 App 级重渲染未改善,留给后续领域迁移。
@@ -680,11 +686,27 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用
- **基准工具:** `GB_PERF_MODEL_PORT` 可把假模型移到其他端口(例如本机已运行 GoodBuddy 占用
11434 时),隔离 profile 通过 `GOODBUDDY_MODEL_*` 环境变量指向它。
#### 2026-10-02 其他改动的架构核对
对同期其他功能改动按本批次 5 条规则核对(监督者功能除外):
- **一致:** 剪贴板改为异步读写(`d773f5e`);未保存修改通过 context 上报、记录不进 App state,
有未保存修改的路由不被缓存淘汰(`43be465`);新会话面板分两步渲染(`09c415b`,过渡方案)。
- **偏离规则 1:** Story Graph 检索(`e97263c`)仍在 Main 内经 `DatabaseSync` 读取后,在 JS 中
逐条 `JSON.stringify` 并按多个关键词匹配,单次成本高于原整句匹配;工具描述又鼓励 Agent
主动调用,调用次数会增加。纳入 `PERF-15`/`PERF-16`,在此之前补测检索耗时并限制扫描规模。
- **偏离规则 2:** 侧栏 5 秒重排(`ee4eb73`,`use-conversation-list-order.ts`)由 App 持有状态,
渲染期间 setState,定时器每 5 秒检查;顺序不变时跳过,当前成本低。交互上悬停、滚动、菜单
打开时不重排。侧栏迁移和虚拟化(`PERF-13`/`PERF-14`)时移入侧栏组件。
- **React 规则:** 缓存会话保持滚动位置(`bf6c4a9`)在渲染期间写 ref,即当前 lint 的 3 条
`react-hooks/refs` 错误;启用 React Compiler 前需改为由状态派生顺序。
### PERF-14 长列表虚拟化
- **优先级 / 状态:** P2 / 待开始
- **实施条件:** `PERF-13` 完成会话与消息迁移,行组件 props 已稳定。
- **范围:** 消息时间线和会话侧栏优先;保留滚动位置、跳转、展开状态和“加载更早消息”语义。
替换新面板分两步渲染(`09c415b`);侧栏 5 秒重排状态随侧栏迁出 App。
- **验收:** 5,000 条消息和 1,000 个会话场景下 DOM 节点数有界,滚动与切换指标改善。
### PERF-15 存储接口异步化
@@ -692,14 +714,17 @@ Renderer 主线程降速 4 倍(Main 不降速,每次 reload 后重新应用
- **优先级 / 状态:** P1 / 待开始
- **范围:** 在原进程内把 `AssistantDatabase`、`KnowledgeDatabase` 等对外接口改为异步,
调用方全部 `await`;会话列表只返回摘要,搜索下推到 SQL,活动记录改为增量追加。
远程 Runtime 实时事件改用已有的 `appendRemoteTaskEventsBatch` 批量写入,不再逐条同步事务。
Story Graph 检索先补测耗时,扫描规模设上限,匹配尽量下推到 SQL。
- **验收:** 行为与测试不变;`PERF-11` Main event-loop 延迟不变差。
### PERF-16 数据进程
- **优先级 / 状态:** P1 / 待开始
- **实施条件:** `PERF-15` 完成,调用方已全部异步。
- **范围:** 新增独占 SQLite 的 `utilityProcess`,承接会话、知识库、向量检索、Story Graph、
活动记录及文档解析;Main 只转发;保证同一时刻只有一个写入方。吸收 `PERF-06` 的范围。
- **范围:** 新增独占 SQLite 的 `utilityProcess`,承接会话、知识库、向量检索、Story Graph
(含 Agent 主动调用的检索)、远程 Runtime 事件持久化、活动记录及文档解析;Main 只转发;
保证同一时刻只有一个写入方。吸收 `PERF-06` 的范围。
- **验收:** 大知识库检索、会话列表和文档导入期间 Main event-loop 延迟达到批次目标;取消、
崩溃恢复和迁移语义不回退。